strcat-in-C错误分割 #包括 #包括 int main(){ char tab[2]={“12”}; 文件*输出文件; char*outname=“/home/dir/”; printf(“%s”,strcat(outname,tab)); outfile=fopen(strcat(outname,btab),“w”); 如果(!outfile){ printf(“打开%s写入时出现问题,\n”,outname); } }
我有一个错误:分割错误strcat-in-C错误分割 #包括 #包括 int main(){ char tab[2]={“12”}; 文件*输出文件; char*outname=“/home/dir/”; printf(“%s”,strcat(outname,tab)); outfile=fopen(strcat(outname,btab),“w”); 如果(!outfile){ printf(“打开%s写入时出现问题,\n”,outname); } },c,C,我有一个错误:分割错误 如何修复它?outname是字符串文字,字符串文字不可修改。修改字符串文字是未定义的行为。至少有两个错误: #include <stdio.h> #include <string.h> int main() { char tab[2]={"12"}; FILE *outfile; char *outname = "/home/dir/"; printf("%s", strcat(outname,tab)); outfile =
如何修复它?
outname
是字符串文字,字符串文字不可修改。修改字符串文字是未定义的行为。至少有两个错误:
#include <stdio.h>
#include <string.h>
int main() {
char tab[2]={"12"};
FILE *outfile;
char *outname = "/home/dir/";
printf("%s", strcat(outname,tab));
outfile = fopen(strcat(outname,btab), "w");
if (!outfile) {
printf("There was a problem opening %s for writing\n", outname);
}
}
您最好使用tab[3]
或者更好的tab[]
——您需要一个额外的字符作为终止NUL字符
而且
在可执行文件的数据段中创建一个常量字符串——它不能被覆盖,因为strcat
正在使用其第一个参数连接两个字符串。因此,当strcat()
尝试这样做时,它会检测故障。使用
char *outname = "etc...";
相反。outname是常量指针,因此一旦您在其中输入了某些内容,您就无法修改它 但是,如果要复制其中的内容,请创建一个大小等于tab[]array的char数组,因为这里要复制的字符串的大小是已知的。大多数情况下,当您从用户获取一次输入时,会使用像OUTNAME这样的字符指针,而您不知道该输入将持续多长时间。在您的代码中
char outname[50]; // something big enough
strcpy(outname, "/home/dir");
outname是字符串文字,因此当与strcat一起使用时,它没有足够的长度来容纳连接的字符串。这会导致分段错误
如果您声明如下,情况也是如此
char *outname = "/home/dir/";
此问题的解决方案是声明足够大的outname的大小,以容纳连接的字符串
char outname[] = "/home/dir/";
我的想法是使用适当的缩进。@H2CO3:如果要修复
main
,不妨将其设置为intmain(void)
@Mat为什么?使用空括号很好(IMHO看起来更好)。@H2CO3:int main()
是一个可以接受任意数量参数的函数(在C语言中,不是C++)intmain(void)
不接受参数。这和int main(int,char**)
是仅有的两个标准主签名。@H2CO3不编辑可能与OP问题相关的内容。如果他按字面意思编写char outname[]=“/home/dir/”
当他调用strcat(outname,…)@mah时,他仍然会有问题,为什么?你说得不对——如果使用char[]而不是char*,编译器将生成一个非常量的字符串,并且可以被覆盖@H2CO3-是的,编译器生成的内容的大小是为了保存字符串常量的内容,仅此而已。由于strcat()
希望追加到字符串中,并且没有分配空间用于追加,因此您将覆盖其他内容。
char outname[] = "/home/dir/";
char outname[80] = "/home/dir/";