- ベストアンサー
文字列比較
最長10文字の文字列を2件入力し、char型の配列にそれぞれ格納する。2つの文字列を比較し、文字列が同じだったら「equal」を表示し異なっていたら「Not equal」を表示するプログラムを作成せよという課題が出ました。 条件として、11文字以上の文字が入力されたら、先頭から10文字までを有効とし、11文字目以降を無視する。下記のプログラムで文字列1に11文字以上入力すると、うまく動きません。なぜ、うまくいかないかと、どうなおしたらよいかを教えてください。 #include<stdio.h> #include<string.h> #define max_length 10 void get_string (char *p_str, int size); int main() { char string1[max_length+2]; char string2[max_length+2]; printf("文字列1:"); get_string(string1,max_length+2); printf("文字列2:"); get_string(string2,max_length+2); if(!strncmp(string1,string2,max_length)) puts("equal"); else puts("Not equal"); } void get_string (char *p_str, int size) { fgets(p_str,size,stdin); }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
前回の質問に回答したものです。 だいぶソースがすっきりしましたね。 >下記のプログラムで文字列1に11文字以上入力すると、うまく動きません。 stdinバッファの問題です。 キーボードで入力された文字をstdinバッファに格納し、 fgets(p_str,size,stdin); で文字をstdinバッファからp_strに読み込んでいます。 例えば abcdefghijklmnopqrstuvwxyzと入力します。 そうするとstdinバッファにabcdefghijklmnopqrstuvwxyz 格納されます。 string1の場合。 fgets(p_str,size,stdin)でsize-1の文字をp_strに読み込みます。 sizeが12なのでsize-1で11です。 結果string1にはabcdefghijkが代入されます。 次のstring2の場合の時に、stdinバッファにはlmnopqrstuvwxyz がまだ残っていますので、lmnopqrstuvを読み込んでしまいます。 ですからstring2にはlmnopqrstuvが入り、Not equalになるのです。 この現象を確認する為に、fgetsの戻り値を表示してみて下さい printf("%s\n",fgets(p_str,size,stdin)); 解決法は、stdinバッファを解放してやればいいだけです。 fgets(p_str,size,stdin); rewind(stdin); //stdinバッファを解放 rewindを使えばできます。 試してないですが、ソースを見た感じでは多分これでいけます。
その他の回答 (1)
- yaemon_2006
- ベストアンサー率22% (50/220)
#include<stdio.h> #include<string.h> int main() { char str0[11], str1[11]; printf("文字列0:"); fgets(str0, 11, stdin); if(strlen(str0) == 10 && str0[9] != '\n'){ while(getchar() != '\n') ; } printf("文字列1:"); fgets(str1, 11, stdin); if(!strcmp(str0, str1)) puts("equal"); else puts("Not equal"); return 0; }