2016-12-20 30 views
-3

これはちょうど私が書いた単なるコードであり、私はストリームに母親を入力すると私には本当の理由が分からない理由を理解できません。彼らがお互いを比較するとき、それは同じでなければならないか、それとも同じでなければならないのですか?
これは私の単純なコードです:文字列とfgetsとの比較

char string[20]; 
fgets(string,20,stdin); 

printf("%s",string); 

if(strcmp(string,"mother")==0) 
{ 
    printf("they are the same"); 
} 
else 
{ 
    printf("they are not"); 
} 

私も

if(string =="mother") 
\\do something 

と試みたが、誰かが私にあなたがCを比較することはできません

+1

'fgets'は文字列を比較しません。 'strcmp'では、文字列がどのように生成されるかは関係ありません**。そして、関数のドキュメンテーションはあなたが理解できないのですか? – Olaf

+3

'fgets()'で読んでいるものを見るには 'printf(" <%s> \ n "、string);を試してください。 – chux

+0

'strcmp(string、" mother \ n ")' – BLUEPIXY

答えて

3
if(string =="mother") // won't work 

を助けることができる、それはちょうど私の本当を与える文句を言いません文字列は==で直接入力します。標準ライブラリ関数を使用しstrcmp代わりにまた

if(0 == strcmp(string, "mother")) 
{ 
    printf("equal"); 
} 

はあなたがfgetsから\nを削除する必要があり、そうでない場合は、文字列の比較がfalseにあると考えます。 fgets()のmanページから

fgets(string,20,stdin); 
string[strcspn(string, "\n")] = 0; // without this, `strcmp` would return false 
0

:あなたの入力に付加される改行文字がある場合

fgets() reads in at most one less than size characters from stream and 
stores them into the buffer pointed to by s. Reading stops after an 
EOF or a newline. If a newline is read, it is stored into the buffer. 
A terminating null byte ('\0') is stored after the last character in 
the buffer. 

は、あなたがチェックしましたか? "mother""mother\n"と同じではありません。

0

fgets入力から改行(\n)が削除されません。あなたは、文字列を比較する前に、(もしあれば)、それを削除する必要があります。

char string[20]; 
fgets(string,20,stdin); 

int len = strlen(string); 
// len-1 is the last character before the original \0 
if(len > 0 && string[len-1] == '\n'){ 
    // remove the new-line by ending the string sooner 
    string[len-1] = '\0'; 
} 

if(strcmp(string,"mother")==0) 

あなたの第二の試みを、確実に動作しません直接==を使用して2つの文字列を比較します。

+2

'' if(len> ' - ' 'if(len> 0') – chux

1

他の人は言っているように、文字列を==と比較することはできません。コードが機能するようにするには、fgets()の末尾に\n文字を追加する必要があります。そうしないと、比較している:あなたは\n文字を削除しない限り、常に、falseになります

if (strcmp("mother\n", "mother") == 0) { 

を。

fgets()以来戻っNULL失敗した場合、ユーザからの入力を読み込むとき、このように、ことを確認しても安心です。

if (fgets(string, 20, stdin) == NULL) { 
    /* Exit program */ 
} 

ます。また、このようなチェックを通り、fgets()をチェックするいくつかの余分なエラーを追加することができますこのように確認することができ、バッファオーバーフロー、これらの考慮後

slen = strlen(string); 
if (slen > 0) { 
    if (string[slen-1] == '\n') { 
     string[slen-1] = '\0'; 
    } else { 
     /* Exit program */ 
    } 
} 

は、あなたのコードは、おそらく次のようになります

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

#define BUFFSIZE 20 

int 
main(int argc, char *argv[]) { 
    char string[BUFFSIZE]; 
    size_t slen; 
    const char *compare = "mother"; 

    printf("Enter a string: "); 
    if (fgets(string, BUFFSIZE, stdin) == NULL) { 
     printf("Error reading string into buffer.\n"); 
     exit(EXIT_FAILURE); 
    } 

    slen = strlen(string); 
    if (slen > 0) { 
     if (string[slen-1] == '\n') { 
      string[slen-1] = '\0'; 
     } else { 
      printf("Buffer overflow. Exceeded buffer size of %d.\n", BUFFSIZE); 
      exit(EXIT_FAILURE); 
     } 
    } 

    if (!*string) { 
     printf("No string entered.\n"); 
     exit(EXIT_FAILURE); 
    } 

    printf("My string = %s.\n", string); 
    if (strcmp(string, compare) == 0) { 
     printf("They are the same.\n"); 
    } else { 
     printf("They are not the same.\n"); 
    } 

    return 0; 
}