2016-03-24 10 views
-1
#include <stdio.h> 
#include <string.h> 
#include <conio.h> 

char str[100]; 

int main(void) 
{ 
    int i, t, j, len; 

    printf("Enter string: "); 
    scanf("%[^\n]ed", str); 

    len = strlen(str); 

    str[len] = ' '; 

    for (t = 0, i = 0; i < strlen(str); i++) 
    { 
     if ((str[i] == ' ') && (str[i - 1] == 'd') && (str[i-2]=='e')) 
     { 
      for (j = t; j < i; j++) 
       printf("%c", str[j]); 
      t = i + 1; 
      printf("\n"); 
     } 
     else 
     { 
      if (str[i] == ' ') 
      { 
       t = i + 1; 
      } 
     } 
    } 
} 

このプログラムでは、「ed」で終わる単語を挿入する必要があります。ユーザーがedで終わる単語を挿入しなかった場合、「ed with words with ed」のようなメッセージが表示されます。私はこれを追加しようとしました:文字列の最後の文字を検索する

if ((str[i] == ' ') && (str[i - 1] == 'd') && (str[i-2]=='e')=NULL) 
printf("There no words with ed"); 

しかし、それは動作しませんでした。

+0

str [len] = ''; 'を' str [len-1] = ''に変更することから始めます。配列インデックスはCでゼロから始まります。 'str [len] = ''は、ゼロ終端文字をスペースで置き換えるため、未定義の動作につながります。 –

+1

'i'が0のときに' str [i - 1] 'にアクセスすると、未定義の動作にもなります。 –

+0

@WhozCraig 'str'はグローバル変数です。 (strは0で初期化されます) – BLUEPIXY

答えて

-1

すべてあなたがあなたの試合を見つけた場合に増分するフラグを作るために必要なもの;あなたがマッチの数を望むならば。またはただ設定される。あなたが状態だけを知りたいならば。

以下は、このフラグに「found」というコードが含まれているかどうかを確認します。また

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

char str[100]; 

int main(void) 
{ 
    int i, t, j, len; 
    int found = 0; 
    printf("Enter string: "); 
    scanf("%[^\n]ed", str); 

    len = strlen(str); 

    str[len] = ' '; 

    for (t = 0, i = 0; i < strlen(str); i++) 
    { 
     if ((str[i] == ' ') && (str[i - 1] == 'd') && (str[i-2]=='e')) 
     { 
      for (j = t; j < i; j++) 
       printf("%c", str[j]); 
      t = i + 1; 
      printf("\n"); 
      found++; 
     } 
     else 
     { 
      if (str[i] == ' ') 
      { 
       t = i + 1; 
      } 
     } 
    } 
    if(found == 0) 
     printf("NotFound\r\n"); 
    return 0; 
} 

、私はあなたのコードにコメントをしました:

  • str[len] = ' 'が許容されていない「」で文字列NULL終端を置き換えます声明は、必ず確認してくださいそのあなたの最後の要素あなたの文字列配列は、NULL(0)
3

コードを書く前にアルゴリズムのロジックを考える必要があります。 "ed"で終わる単語を検索する場合は、明らかに文字列の最後を検索する必要があります。また、2つの文字しかありません。それらは常に最後に指定された順序で配置されています。なぜ、なぜ始めるにはループが必要でしょうか?

iを0で初期化してから、i-1のようなコードを含むループ本体を使用するにはどうすればよいでしょうか?

文字列の最後の文字を取得するには、あなたは次のように行います:

size_t last_index = strlen(str) - 1; // -1 because C arrays are 0-indexed. 
char last_char = str[last_index]; 

そして、その前の文字を取得するには、last_index-1を使用しています。次に、これらの2つの文字を 'e'と 'd'に対して単純に比較します。ループは必要ありません。

+2

文字列が実際に長さゼロの場合、これらの2行のコードはUBをトリップします。長さゼロの文字列を持つ64ビットプラットフォームは 'last_index'の値に' 18446744073709551615'を格納します。 – WhozCraig

+0

@WhozCraigはい、また、 'str'が文字列などでない場合はUBも発生します。したがって、ユーザ入力を確認してください。これは、アルゴリズムに関連しない別個のタスクです。 – Lundin

1

まず物事まず、あなたのご期待通りの入力が行全体が読み込まれた場合には「私はあなたを愛して」のようなものは、無視して、あるときscanf("%[^\n]ed", str);が動作しない場合がありますの "ed"フォーマット文字列。

実際、あなたの要件を達成するための別のアプローチがあります。これは非常に簡単です。

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

int main(void) 
{ 
    char str[100], *substr; 
    size_t len; 
    puts("Enter string: "); 
    fgets(str, 100, stdin); 
    substr = strtok(str, " "); 
    while(substr) 
    { 
     len = strlen(substr); 
     if (substr[len - 2] == 'e' && substr[len - 1] == 'd') 
      puts(substr); 
     substr = strtok(NULL, " "); 
    } 
} 

自分のコードがstrtok()を使用したコードよりも優れているとは思いません。標準的なライブラリ関数を利用することは、あなたの人生をはるかに簡単にするでしょう。

関連する問題