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/";