【问题标题】:Appending character arrays using strcat does not work使用 strcat 追加字符数组不起作用
【发布时间】:2011-08-22 07:30:13
【问题描述】:

谁能告诉我这段代码有什么问题???

char sms[] = "gr8";  
strcat (sms, " & :)");

【问题讨论】:

  • 您需要获得beginner’s book of C++ 才能学习该语言的基础知识。
  • 或者,关于这个问题,一本涵盖 C 的书。
  • 哦...您正在尝试创建多语言源文件。这种方法会有很多问题。我建议你坚持CC++ 之一:)

标签: c++ c buffer-overflow string-literals strcat


【解决方案1】:

sms 是一个大小为4 1 的数组。而且您正在附加更多的字符文字,这些文字超出了数组的范围,因为数组最多可以容纳 4 字符,而该字符已经被 g, r, 8, \0 占用。

1.顺便说一句,为什么正好是 4?答:因为最后有一个空字符!

如果您提到数组的大小如下所示,那么您的代码是有效且定义明确的。

char sms[10] = "gr8";  //ensure that size of the array is 10
                       //so it can be appended few chars later.
strcat (sms, " & :)");

但是 C++ 为您提供了更好的解决方案:使用 std::string 作为:

#include <string>  //must

std::string sms = "gr8";
sms += " & :)"; //string concatenation - easy and cute!

【讨论】:

    【解决方案2】:

    在 C 中,数组不会自动增长。

    sms 具有特定的长度(在这种情况下为 4 - 三个字母和终止的 NULL)。当您调用strcat 时,您正试图将字符附加到该数组超过其长度。

    这是未定义的行为,会破坏您的程序。

    如果你分配了一个足够大的数组来包含两个字符串,你会没事的:

    char sms[9] = "gr8";
    strcat (sms, " & :)");
    

    C++ 对数组有(基本上)与 C 相同的限制。但是,它提供了更高级别的功能,因此您不必经常处理数组,例如std::string

    #include <string>
    
    // ...
    
    std::string sms = "gr8";
    sms += " & :)";
    

    这样做更好的原因是您不必提前知道字符串的确切长度。 C++ 将为您增加内存中的底层存储。

    【讨论】:

      【解决方案3】:

      您的短信缓冲区只有 4 个字符长。 strcat 将在其末尾再复制 5 个字符并破坏堆栈。

      【讨论】:

        【解决方案4】:

        缓冲区溢出字符数组随后在某处崩溃!

        【讨论】:

          【解决方案5】:

          您正在将数据复制到未分配的内存中。

          当你这样做时:char sms[] = "gr8"; 你创建了一个有 4 个字符的 char 数组,“gr8”加上字符串末尾的 0 字符。

          然后,您尝试使用 strcat 调用将额外字符复制到数组中,超出数组末尾。这会导致未定义的行为,这意味着会发生不可预知的事情(程序可能会崩溃,或者您可能会看到奇怪的输出)。

          要解决此问题,请确保要将字符复制到的数组足够大以包含所有字符,并且不要忘记末尾的 0 字符。

          【讨论】:

            【解决方案6】:

            是的,没有多余的字符空间。 sms[] 只分配足够的空间来存储它初始化的字符串。

            使用 C++,更好的解决方案是:

            std::string sms = "gr8";
            sms += " & :)";
            

            【讨论】:

              猜你喜欢
              • 2018-07-28
              • 1970-01-01
              • 1970-01-01
              • 2019-10-24
              • 2015-06-04
              • 2018-10-05
              • 2016-11-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多