下面的所有代码都在 C 上。
下面两个代码片段都编译通过了,不同的是第二个程序在启动时崩溃了。
一:
#include <stdio.h>
#include <string.h>
void main() {
char *foo = "foo";
char *bar = "bar";
char *str[80];;
strcpy (str, "TEXT ");
strcat (str, foo);
strcat (str, bar);
}
两个:
#include <stdio.h>
#include <string.h>
void main() {
char *foo = "foo";
char *bar = "bar";
char *str="";
strcpy (str, "TEXT ");
strcat (str, foo);
strcat (str, bar);
}
不同的是,第一种情况表示str
字符串的大小,而第二种情况则不是。如何在不直接指示字符串 str
大小的情况下进行字符串连接?
最佳答案
The difference is that in the first case, said the size of the str string, while the second is not.
没有。在第一个程序中,如下语句
char *str[80];
将 str
定义为指向字符的 80
指针数组。你需要的是一个字符数组——
char str[80];
在第二个程序中,
char *str="";
将 str
定义为指向字符串文字 ""
的指针,而不是数组。数组和指针是不同的类型。
现在,第二个程序崩溃了,因为
char *str="";
将 str
定义为指向字符串文字的指针。 strcpy
的第一个参数应该是一个指向缓冲区的指针,该缓冲区足够大,可以复制第二个参数指向的字符串。
但是,str
指向分配在只读内存中的字符串文字""
。通过将 str
传递给 strcpy
,它调用了未定义的行为,因为 strcpy
试图修改它,这是非法的。未定义的行为意味着行为是不可预测的,任何事情都可能发生,从程序崩溃到由于段错误(非法内存访问)或您的硬盘驱动器被格式化。您应该始终避免调用未定义行为的代码。
How to make string concatenation without a direct indication of the size of the string str?
目标字符串必须足够大以存储源字符串,否则 strcpy
将溢出其第一个参数指向的缓冲区并由于非法内存访问而调用未定义的行为。同样,目标字符串必须有足够的空间供源字符串附加到它,否则 strcat
将溢出缓冲区并再次导致未定义的行为。在这种情况下,您应该通过指定字符串 str
的正确大小来确保避免这种情况。
关于c - 字符串连接。 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23166125/