自动在strcat函数中附加字符串

时间:2013-09-16 18:39:02

标签: c++ c

我遇到了strcat()函数的问题。请解释一下这个功能是如何运作的。

char a[] = "AT";
char x[] = "KA";
char y = 'X';
sen(a);
s = strcat(a, "+CMGF=");
sen(s);
s = strcat(s, "\r\n");
sen(s);
s = strcat(s, &y);
sen(s);
getch();
return 0;

S是一个glopal字符指针& sen()是一个只打印包含字符串数据的函数。现在s的最终值是“AT + CMGF = \ r \ n \ nXKA”。

它会自动将x数组附加到s中的最后一个,尽管我还没有编写它的代码。

为什么会这样?请解释我

2 个答案:

答案 0 :(得分:5)

char a[] = "AT"将创建一个长度恰好为3个字符的字符串。当你然后strcat其他内容时,它会在a变量之后写入内存。在x之前恰好是一些未使用的空间。 [从技术上讲,当你在a的外部空间写作时会发生什么是未定义的行为,并且绝对不能保证来自KA的{​​{1}}实际上距离{{1}的精确距离或者代码没有以某种方式崩溃 - 未定义的行为意味着C ++标准没有解释会发生什么,并且允许编译器和/或运行时库崩溃或以某种方式运行那"不是你所期望的"在这种行为中以某种其他方式 - 在调用UB时允许系统可能执行的任何操作]

确保目标字符串x很难保持你的字符串,但你不会遇到这个问题。

答案 1 :(得分:4)

您处于未定义行为的范畴。更具体地说,它正在做的是:

char a[] = "AT";
char x[] = "KA";
char y = 'X';
s = strcat(a, "+CMGF="); // a is a constant string, so this is NOT fine.  You should be calling s = strcat(s, a) and then s = strcat(s, "+CMGF=")
s = strcat(s, "\r\n"); // "\r\n" = "\r\n\0", so it is also fine
s = strcat(s, &y); // y is a char, and is NOT null-terminated, so it is NOT fine

您正在使用的编译器在内存部分并排放置yx,所以strcat正在运行,直到找到第一个空终止符。所有这一切都假设s有足够的空间来保存所有这些连接(如果没有,你处于另一个未定义行为的领域)。

纠正所有已知问题:

char s[100] = {0}; // showing declaration of s of sufficient size
char a[] = "AT";
char x[] = "KA";
char y[] = "X";

sen(s); // shows empty string
s = strcat(s, a); // append a to empty s
s = strcat(s, "+CMGF="); // append "+CMGF=" to the end of new s
sen(s); // will now show "AT+CMGF="
s = strcat(s, "\r\n"); // add "\r\n"
sen(s); // will now show "AT+CMGF=\r\n"
s = strcat(s, y); // append y
sen(s); // will now show "AT+CMGF=\r\nX"