2016-06-28 137 views
1

我正在做一个C练习,让自己了解这个主题。我正在尝试使用我的程序来操作头文件;但程序返回“分段错误”。我已经将问题隔离到以下代码段。任何人都可以帮我看看究竟有什么问题吗?在字符串连接中导致此分段错误的原因是什么?

header=strtok(st,"\""); 
    header=strtok(NULL,"\""); 
    f=fopen(header,"r"); 
    if(f) 
    { 
      while((ch=fgetc(f))!=EOF) 
      fputc(ch,f2); 

      fclose(f); 
    } 
    else 
    { 
      header2=(char *)malloc(strlen("/usr/include")+strlen(header)); 
      header2=strcat("/usr/include/",header); 
      f=fopen(header2,"r"); 

      printf("%s\n",header2); 

      while((ch=fgetc(f))!=EOF) 
      fputc(ch,f2); 

      fclose(f); 
    } 

我已经指出,只有当我试图进入/ usr/include目录/位置出现问题。某种认证问题?如果是这样,怎么过来呢?提前致谢。 :)

+1

你不能做到这一点:'标题2 = strcat的( “/ usr/include目录/”,报头);'。第一个参数必须是目标缓冲区。 –

+0

使用前从'strtok'检查结果'header'。 –

+0

解决所有其他问题后,您仍然需要检查第二个“fopen”的返回值。 – user3386109

回答

2

的主要问题是在

header2=strcat("/usr/include/",header); 

为你的目的地供应string literal。这没有任何空间来容纳串联的字符串。所以,你基本上试图访问调用undefined behavior的无效内存。

这就是说,对于strcat(),行为,(重点煤矿

strcat()功能追加src字符串到dest串,覆盖在终止空字节'\0'dest,[...]

其中,在你的情况下,涉及尝试修改一个str文字,它再次调用UB。

之后,有更多的指出,像

+0

字符串文字也不可修改。 – Barmar

+0

@Barmar对,这也是一个有效的点,明确了空置换,让我补充一下。 –

3

不能使用字符串文字作为strcat的目标 - 字符串文字不可修改,并且它没有足够的空间容纳连接的字符串。将变量与前缀结合的更好方法是sprintf

header2 = malloc(strlen("/usr/include/")+strlen(header)+1); 
sprintf(header2, "/usr/include/%s", header); 

请注意,你需要加1的长度之和调用malloc()时,允许尾随空字节的空间。

你也可以使用strcpy其次strcat

strcpy(header2, "/usr/include/"); 
strcat(header2, header); 
+0

'sprintf'就像'printf',但它将结果放在字符串中而不是打印出来。 – Barmar

相关问题