1

我遇到了 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 是一个全球字符指针 & sen() 是一个函数,仅用于打印包含的字符串的数据。现在 s 的最终值为 "AT+CMGF=\r\nXKA"。

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

为什么会这样?请解释一下

4

2 回答 2

5

char a[] = "AT"将创建一个正好为 3 个字符长的字符串。当你再给它别的东西时,它会在变量strcat之后写入内存。a这恰好是之前的一些未使用的空间x。[从技术上讲,当您在 of 之外编写空间时会发生什么a是未定义的行为,并且绝对不能保证KAfromx实际上只是与 的精确距离a,或者代码不会以某种方式崩溃 - 未定义的行为意味着 C++标准没有解释会发生什么,并且允许编译器和/或运行时库在此类行为期间以某种其他方式崩溃或以“不是您所期望的”方式运行 - 您的系统可能会做的任何事情调用UB时允许]

确保目标字符串a足够大以容纳您的字符串,并且您不会遇到这个问题。

于 2013-09-16T18:44:21.187 回答
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"
于 2013-09-16T18:49:23.083 回答