2016-11-07 14 views
-3

Iveは、行の中に "The end"というフレーズを単独で入力するまで、ユーザーがテキスト行を入力できるようにするCプログラムを開発中です。プログラムは、 "is"が出現するたびに "was"という文字列を置き換え、変更の回数を数えます。C言語を使って文字列内の単語を置換するプログラム

これまでのところ、私はいくつかのコードを書いているが、私はそれが正しく機能するために取得する方法で失われた少しを取得しています、今のように、プログラムが

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



int main() 
{ 
    char str[500];// ="- This, a sample string."; 
    char * pch; 
    char endTerm[5000]; 

    printf("Enter a string to parse: "); 
    scanf("%[^\n]",str); 
    strcat(endTerm, str); 


    while ((strcmp(str, "the end")) != 0 || (strcmp(str, "the end.")) != 0) 
    { 
      scanf("%[^\n]",str); 
      strcat(endTerm, str); 
    } 



    printf ("Your original string was: %s\n\n",endTerm); 
    pch = strtok (endTerm," ,-"); 


    while (pch != NULL) 
    { 
     if ((strcmp(pch, "is")) == 0) 
     { 
      pch = "was"; 
     } 
     else if ((strcmp(pch, "is.")) == 0) 
     { 
      pch="was."; 
     } 


     printf ("%s ",pch); 
     pch = strtok (NULL, " ,-"); 
    } 

    printf("\n\n"); 





    return 0; 
} 

私にバッファオーバーフローのエラーを与えていますおそらく、ユーザーが終了を入力した場合、プログラムを終了する方法を見つけることができますが、私は本当に単語を置き換えると助けが必要でした。

+1

あなたのコードは非常に多くのコンパイラ警告を生成します。彼らは確かにあなたが持っている問題の源であるので、ここで助けを求める前にそれらのすべてを修正する必要があります。 –

+0

私はXcodeをもう一度チェックし、Xcodeが警告しているコード行を削除しました – brandontod97

+1

まだ基本的なエラーが多すぎます。たとえば、 'strcat(finalString、strcat(" "、pch));' 'finalString'はどこにポイントしていますか?設定されていないので、それを書き込もうとすると未定義の動作になります。 – kaylum

答えて

0

上記のコメントに他の人が指摘しているように、プログラムにはいくつかの欠陥があります。

  1. 最初の瑕疵はstrcat機能の使用です。ドキュメントを読むと、strcatは最初の引数をデスティネーションポインタとして扱うので、ユーザがデスティネーションポインタに十分なメモリ(連結された文字列を保持するのに十分な)を割り当てることを期待しています。あなたの場合、1文字だけを収容できる ""の文字列を渡しています。これが原因で、バッファオーバーフローまたはセグメンテーションフォルトが発生しています。
  2. プログラムの2番目のエラーは、strcmpの機能を使用しています。この関数は、2つの文字列が等しい場合に0(これはfalseで定義され、trueではstrbool.hではありません)を返します。
  3. プログラムの3番目の問題は、関数strtokの使用にあります。残りのトークンへのポインタを取得するには、2回目の呼び出し以降の最初の引数としてNULLを渡す必要があります。

この3つのエラーを最初に修正してから、必要な出力を得るために他に何が修正されるべきかを考えてみてください。

+0

コードを編集しました。私は#include を削除し、strtokも正しく動作するようにしました。私が持っている唯一の問題は、私がstrcat(endTerm、str)を使うときです。前と同じようにオーバーフローが発生し、5000文字を割り当てようとしましたが、オーバーフローが発生します。ここからどこに行くのか分からないImプログラミングでは新しいので、ポインタを使用するのに慣れていない。 – brandontod97