strcat中的C错误分割

时间:2012-07-15 10:53:11

标签: c

#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);
  }
}

我有这个错误:分段错误。

我该如何解决?

4 个答案:

答案 0 :(得分:1)

outname是字符串文字,字符串文字不可修改。修改字符串文字是未定义的行为。

答案 1 :(得分:1)

至少有两个错误:

char tab[2] = {"12"};

您最好使用tab[3]甚至更好tab[] - 您需要一个额外的字符来终止NUL字符。

此外,

char *outname = "etc...";

在可执行文件的数据段中创建一个常量字符串 - 它不能被覆盖,因为strcat正在使用其第一个参数来连接两个字符串。因此,当strcat()尝试这样做时,会出现段错误。使用

char outname[50]; // something big enough
strcpy(outname, "/home/dir");

代替。

答案 2 :(得分:0)

outname Const指针,所以一旦你输入了一些内容,就无法修改

但是如果要复制其中的内容,请创建一个大小等于tab []数组的char数组,因为这里要复制的字符串大小是已知的。大多数情况下,当您从用户那里获取输入时,会使用像OUTNAME这样的字符串指针而您不知道输入的时间长度。

答案 3 :(得分:0)

在您的代码中,

char *outname = "/home/dir/";

outname是一个字符串文字,因此当与strcat一起使用时,它没有足够的长度来保存连接的字符串。这会导致分段错误。

如果您将其声明如下,则情况相同,

char outname[] = "/home/dir/";

解决方法是将outname的大小声明为足以保存连接字符串。

char outname[80] = "/home/dir/";