2017-11-30 22 views
-1

ループ中にダブルをしようとすると、コードがクラッシュするこれは私の宿題なので、アルゴリズムやstringを使用することはできません。 char配列のみが許されます。 誰かが私にそれを解決するのを手伝ってもらえますか? 256が一定であるため重複する単語を検索

#include <iostream> 
#include <limits> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    const char sepTxt[] = ".,:;()!%^?<>- "; 
    int szTxt; 
    char *txt = new char[256]; 
    cout << "Enter text length: "; 
    cin >> szTxt; 
    while(cin.fail()) 
    { 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "\nFail. Try again.\nEnter text length: "; 
     cin >> szTxt; 
    } 
    cin.ignore(1,'\n'); 
    cout << "Enter text: "; 
    cin.getline(txt,szTxt); 
    while (cin.fail() || strlen(txt) < 1) 
    { 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "\nFail. Try again.\nEnter text: "; 
     cin.getline(txt,szTxt); 
    } 
    char *txtTmp = new char [szTxt]; //initialization dynamic arr for temp copy of entered text 
    strncpy(txtTmp, txt, szTxt); //copy entered text to txtTmp 
    char *bufTxt = strtok(txt, sepTxt); //find first word; 
    char resTxt[256] = {}; 
    while (bufTxt) //crash here; 
    { 
     bufTxt = strtok(NULL, sepTxt); 
     while ((txtTmp = strstr(txtTmp, bufTxt))) 
     { 
      strcat(resTxt,bufTxt); 
      strcat(resTxt," "); 
      txtTmp+=strlen(bufTxt); 
     } 
    } 
    cout << "\nDouble words: " << resTxt; 
    delete []txt, txtTmp; 
} 
+0

2番目のstrtokを実行し、NULLであるかどうかをチェックしません。 –

+0

NULLをチェックしたり追加してもクラッシュします bufTxt = strtok(NULL、sepTxt);最後に –

+0

おすすめ:テキストのサイズを知ってから 'char * txt = new char [szTxt];'に変更すると 'char * txt = new char [256];'に移動してください。少々厄介な驚き。おそらく1を加えるべきでしょう。奇数は、ユーザーがカウントにヌルターミネータを含めないことです。 – user4581301

答えて

1

あなたは、例えば、ローカル変数char *txt = new char[256];を割り当て、それは無駄であり、削除、コードを簡略化しなければなりません。この場合はchar txt[256];が良いでしょう。

テキストの長さをユーザーに聞いても、基本的にそのサイズは無視されます。ちょうど256とすれば十分です。テキストの長さが256より大きい場合は、txtを使用することはできません。そのサイズに基づいて動的に割り当てる必要があります。

strtokに進むことができます。追加作業は必要ありません。

const char sepTxt[] = ".,:;()!%^?<>- "; 
char txt[256]; 
cin.getline(txt, sizeof(txt)); 

char *previous = nullptr; 
char *token = strtok(txt, sepTxt); 
while(token) 
{ 
    token = strtok(nullptr, sepTxt); 
    if(previous && token && strcmp(previous, token) == 0) 
     cout << "duplicate " << token << endl; 
    previous = token; 
} 

重複が互いの隣に表示されない場合は、単語を配列に読み込む必要があります。 txtの長さが256バイトの場合は、256ワードを超えないと仮定することが安全です。char *arr[256]を宣言し、各要素をトークン値に割り当てることができます。例:

char *arr[256] = { NULL }; 
int count = 0; 
while(token) 
{ 
    arr[count++] = token; 
    token = strtok(nullptr, sepTxt); 
    previous = token; 
} 

for(int i = 0; i < count; i++) 
{ 
    for(int j = i + 1; j < count; j++) 
    { 
     if(strcmp(arr[i], arr[j]) == 0) 
     { 
      cout << "duplicate " << arr[i] << endl; 
      break; 
     } 
    } 
} 
+0

Tnx for help <3 しかし、私はすべての繰り返しの言葉を得る必要があります。 たとえば、文字列がある場合:test qwer test zzz test 答えに入るはずです。テストテスト 単語が繰り返し出現するだけです。 上記のコードは、左右に繰り返し単語がある場合にのみ正しく動作します。 –

+0

TNX YOU SOO MUCH <3 –

関連する問題