0

C で動作するセグメンテーション違反に問題があり、なぜこれが発生しているのかわかりません。fget(c) 関数の誤用と関係があると思います。

  while((ch = fgetc(fp))!= EOF) { 
printf("Got inside first while: character is currently %c \n",ch); //**********DELETE
  while(ch != '\n') {
char word[16]; //Clear out word before beginning   
i = i+1;          //Keeps track of the current run thru of the loop so we know what input we're looking at.
while(ch != ' ') { 
  printf("%c  ",ch); //**********DELETE
  //The following block builds up a character array from the current "word" (separated by spaces) in the input file.
  int len = strlen(word);
  word[len] = ch;
  word[len+1] = '\0';
  printf("%s",word);
  ch = fgetc(fp);
}

//The following if-else block sets the variables TextA, TextB, and TextC to the appropriate Supply Types from the input.
//This part may be confusing to read mentally, but not to trace.  All it does is logically set TextA, B, and C to the 3 different possible values SupplyType.
if(word!=TextB && word!=TextC && i==1 && TextB!="") {
  strcpy(TextA,word);
}
else if(word!=TextA && word!=TextC && i==1 && TextC!="") {
  strcpy(TextB,word);
}
else if(word!=TextB && word!=TextA && i==1) {
  strcpy(TextC,word);
}

switch(i) {
case 1:
  if(TextA == word) {
    SubTypeOption = 1;
  }
  else if(TextB == word) {
    SubTypeOption = 2;
  }
  else if(TextC == word) {
    SubTypeOption = 3;
  }
  break;
case 2:
  //We actually ultimately don't need to keep track of the product's name, so we do nothing for case i=2.  Included for readibility. 
  break;
case 3:
  WholesalePrice = atof(word);
  break;
case 4:
  WholesaleAmount = atoi(word);
  break;
case 5:
  RetailPrice = atof(word);
  break;
case 6:
  RetailAmount = atoi(word);
  break;
}//End switch(i)        

ch = fgetc(fp);
  }//End while(ch != '\n')

//The following if-else block "tallys up" the total amounts of SubTypes bought and sold by the owner.

if(SubTypeOption == 1) {
  SubType1OwnersCost = SubType1OwnersCost + (WholesalePrice*(float)WholesaleAmount);
  SubType1ConsumersCost = SubType1ConsumersCost + (RetailPrice *(float)RetailAmount);
}
else if(SubTypeOption == 2) {
  SubType2OwnersCost = SubType2OwnersCost + (WholesalePrice*(float)WholesaleAmount);
  SubType2ConsumersCost = SubType2ConsumersCost + (RetailPrice *(float)RetailAmount);
}
else if(SubTypeOption == 3) {
  SubType3OwnersCost = SubType3OwnersCost + (WholesalePrice*(float)WholesaleAmount);
  SubType3ConsumersCost = SubType3ConsumersCost + (RetailPrice *(float)RetailAmount);
}

  }//End while((ch = fgetc(fp))!= EOF)

gdb ( a.outの単純な実行) を使用すると、問題が getc に関連していることがわかりましたが、どの行/どの行かはわかりません。ただし、私のプログラムは「最初に横になった:キャラクターは現在Sです」と出力します。この S は入力ファイルの最初の文字なので、ある程度は機能していることはわかっていますが、その後、セグ フォールトが発生します。

何がうまくいかないのか、またはこの問題をデバッグする方法について誰かアドバイスがありますか? 私は C に比較的慣れておらず、主に構文について混乱しています。私はいくつかの小さな構文上のことを間違っていると感じています。

ところで、このコード スニペットは、文字列から単語を取得するためのものです。例: このプログラムを手伝ってください

「ヘルプ」に相当する単語を与える必要があります

更新:今、ちょっとクールなエラーが発生しています(不可解ですが)。再コンパイルすると、次のようになりました。

単語は今 w S 単語は今 w Su 単語は今 w Sup ... 等々、単語のピラミッドを構築しながらしばらく続くことを除いて。

私の入力ファイルには「SupplyTypeA 1.23 1 1.65 1」という文字列しかありません。

更新: セグメンテーション違反が修正されました (問題は、 fgetc() を使用してファイルの終わりを過ぎていたことです)。みんな、ありがとう。

誰かがまだこれをちらりと見たら、出力ファイルに正しい数値が含まれていない理由を理解するのに役立つでしょうか? おそらく、私が得ている言葉で atof と atoi を誤用していると思います。

4

2 に答える 2

2

-g -O0 オプションを使用してプログラムをコンパイルしてください。

次のステップでは、GDB でプログラムを 1 行ずつ見ていき、プログラムが何を行っているかを見て理解してください。さまざまな変数を見てください。これは不可欠なデバッグ スキルです。

停止したら、コマンド「k」を入力します。これにより、スタック トレースが得られます。トレースの最後の行には、失敗した行番号が表示されます。

于 2013-02-08T17:35:15.563 に答える
0

古き良き C には「fget」はありませんが、「fget」という名前の新しいバージョンを使用している可能性があります。おそらく、「fgetc」を使用するつもりでした。CI/O 関数が "f" で始まる場合、"fgetc" のように、通常は引数として FILE* ハンドルが必要です。ドキュメントを読んだ後、代わりに「fgetc」を使用してみてください。

于 2013-02-08T17:26:12.507 に答える