-2

ファイルから各行を取得し、いくつかの文字列操作を実行しようとしています。しかし、私のコードはセグメンテーションフォールトをスローします。ある行で別のプログラムと同じものをテストしましたが、正常に動作します。しかし、ファイルから読み取って文字列操作操作を行うと、セグメンテーション違反が発生します。

変数宣言:

char *pch3,str1[100],str2[100]


 pch3 = strtok(line3,",");
                        while(pch3!=NULL)
                        {
                                if(strcmp(pch3,"?") == 0)
                                {
                                       strcat(str1,"0");
                                       strcat(str1,",");
                                }
                                else
                                {
                                       strcat(str1,pch3);
                                       strcat(str1,",");
                                }
                                pch3 = strtok(NULL,",");
                        }
                        strlen1=strlen(str1);
                        memcpy(str2,str1,strlen1-1);
                        fp2=fopen("breast-cancer-wisconsin-miscellaneous-cleansed.data","a");
                        fprintf(fp2,"%s\n",str2);
                        fclose(fp2);
4

3 に答える 3

1

str1とを初期化しないstr2でください。つまり、使用strcatすると前の文字列の終わりを見つけようとしますが、ゼロが含まれていない場合でも、のどこにstr1でも配置できます。str1str1

宣言をこれに変更すると、うまく機能するはずです。

char *pch3, str1[100] = "", str2[100] = "";
于 2012-09-12T07:55:29.127 に答える
0

これで現在の問題は解決しませんが、stat(3)とmmap(3)の使用を検討してください。その後、メモリ領域を処理できます。または、fgets(3)/ feof(3)/ ferror(3)でループを作成し、入力の各行を処理することもできます。

memsetを介してすべてのバッファをゼロに初期化してください。

あなたもおそらくすることができます

char str1[100] = { 0 };

strcat(3)も悪です。代わりに、snprintf(3)を使用するか、何をしているのかがわかっている場合はstrncat(3)を使用してみてください。詳細については、関連するマニュアルページをお読みください。

于 2012-09-12T07:55:12.273 に答える
0

考慮すべき1つの特定の詳細:strtok()は、最初のパラメーターとして渡す文字列を変更します。次のコードが機能します。

#include <stdio.h>
#include <string.h>

void processLine (const char *line3) {
  char *pch3 = NULL, str1[100] = "", str2[100] = "";
  int strlen1 = 0;
  FILE* fp2 = NULL;

  pch3 = strtok (line3, ",");
  while (pch3 != NULL) {
      if (strcmp (pch3, "?") == 0) {
          strcat (str1, "0");
          strcat (str1, ",");
      } else {
          strcat (str1, pch3);
          strcat (str1, ",");
      }
      pch3 = strtok (NULL, ",");
    }

  strlen1 = strlen (str1);
  memcpy (str2, str1, strlen1 - 1);
  fp2 = fopen ("breast-cancer-wisconsin-miscellaneous-cleansed.data", "a");
  fprintf (fp2, "%s\n", str2);
  fclose (fp2);
}

main () {
  char input[100] = "first,?,second,third,fourth,?";
  processLine (input);
}

繰り返しになりますが、strcat()の代わりにstrncat()のようなより多くのバッファオーバーフローセーフ関数を使用することを検討し、バッファオーバーフローを回避するためにバッファ長をチェックするガードまたは少なくともアサーションを追加してください。

于 2012-09-12T08:36:40.220 に答える