2016-06-28 15 views
1

私はトピックで自分自身を磨くためにCでエクササイズをしています。私はプログラムを使ってヘッダファイルを操作しようとしています。プログラムは "Segmentation fault"を返します。私はこの問題を以下のコードの部分に分けました。誰にでも私が正確に何が間違っているかを見るのを助けることができますか?文字列連結でこのセグメンテーションフォルトの原因は何ですか?

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/locationにアクセスしようとしているときにのみ発生することに注意してください。何らかの認証の問題?もしそうなら、それをどうやってやりますか?前もって感謝します。 :)あなたがとしてstring literalを供給しているよう

+1

あなたはこれを行うことはできません: 'HEADER2 = strcatは( "は/ usr /含める/"、ヘッダ);'。最初のパラメータは宛先バッファでなければなりません。 –

+0

'strtok'から結果' header'をチェックしてから使用してください。 –

+0

他のすべての問題が修正された後、2番目の 'fopen'から戻り値をチェックする必要があります。 – user3386109

答えて

2

主要な問題は

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

です。これには、連結された文字列を保持するためのスペースがありません。したがって、本質的にはundefined behaviorを呼び出す無効なメモリにアクセスしようとしています。 strcat()関数がで終端ヌルバイト'\0')を上書きし、dest文字列にsrc列を付加

strcat()ため、挙動が、(強調鉱山)であり、前記

dest、[...]

あなたの場合は、strリテラルはUBを呼び出す。

その後、

    のように、指摘して複数ある
  • strlen()ようにサイズなどの+1が含まれている必要がありますメモリを割り当てるためのstrlen()を使用して、文字列ための終端のヌル・バイトをカウントしません。ヌル終了のためのスペースを確保してください。

  • Please see this discussion on why not to cast the return value of malloc() and family in C.

  • 返り値を使用する前に、成功のためには常にfopen()のようなライブラリ呼び出しの戻り値を確認してください。
+0

文字列リテラルも変更できません。 – Barmar

+0

@Barmar右、それはまた有効な点であり、ヌル置換と見なされます。 –

3

あなたはstrcatの対象として文字列リテラルを使用することはできません - 文字列リテラルは変更できません、それが連結された文字列を保持するのに十分なスペースがありません。変数と接頭辞を組み合わせるより良い方法はsprintfです。末尾のNULLバイトのためのスペースを確保するために、malloc()を呼び出すときに組み合わせた長さに1を追加する必要が

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

注意。

またstrcat続いstrcpyを使用することができます。

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

'sprintf'は' printf'と似ていますが、結果を文字列にするのではなく、文字列を出力します。 – Barmar

関連する問題