2016-09-20 2 views
0

私は、配列のメンバーをループして文字をスキャンして、特定の文字を探す簡単なプログラムを作成しようとしています。私はstrcmp()がループの始めにしか動かない問題に遭遇しました。私はこれがなぜ起こり、どんな助けが評価されるのか理解するのに苦労しています。strcmpはループの最初でのみ動作します

char *file[3] = {"!x", "!!x", "x!"}; 

for (int i = 0; i < sizeof(file)/sizeof(file[0]); i++) { 
    char *line = file[i]; 
    printf("\n"); 
    for (int i = 0; i < strlen(line); i = i + 1) { 
    char character = line[i]; 
    if (strcmp("!", &character) == 0) { 
     printf("[YES] %c\n", character); 
    } else { 
     printf("[NO] %c\n", character); 
    } 
    } 
} 

出力は

[YES] ! 
[NO] x 

[YES] ! 
[NO] ! 
[NO] x 

[NO] x 
[NO] ! 
+0

なぜ**文字列比較関数を使用して単一の**文字**を比較しますか? – Olaf

+0

あなたは未定義の振る舞いをしているかもしれません。文字列ではないので、charのポインタのどこかにゼロがあることを保証するものはありません。 –

+0

ここでヌル終端文字列が必要であるというコメントは、もちろん正しいです。この場合、文字列中の残りの文字を知っているので、 '&character'の後ろに何が来るのか知っているので、動作は変わっていません。それがなぜこの特定の方法で不正行為をするのかはわかりません。 – Brick

答えて

2

strcmp関数はnullのアドレスは、文字列を終了し期待しています。代わりに、charのアドレスを渡しています。 strcmpは、characterを過ぎたメモリ位置を読み取ろうとし、その結果、undefined behaviorになります。

実際の問題は、文字列を比較したくないということです。あなたは文字を比較したい。

if (character == '!') { 
0

strcmp()はヌル終了文字列を比較します。コード内:

char character = line[i]; 
if (strcmp("!", &character) == 0) 

characterはNULLで終了する文字列ではありません。それがまったく動作するのは間違いです。

あなたは文字列を比較するより、このようなものが必要:文字を比較する

char character[2] = { line[i], '\0' }; 
if (strcmp("!", character) == 0) 

またはこのよう:

char character = line[i]; 
if (character == '!') 
1

ここでの問題は、あなたがstrcmp()に間違った引数を供給している、です、 &character文字列へのポインタではありません。

引用符C11、章int strcmp(const char * s1、const char * s2);

int strcmp(const char *s1, const char *s2);

strcmp関数は、文字列を文字列にs1によって指さ s2によって指さ比較。

だから、それは両方の引数があなたのケースではありません文字列型であることを期待しています。

あなたは、単にその上

if (line[i] == '!') //notice the '' s, they are not ""s 

と同様に、char Sを比較する比較演算子==を使用することができます。

関連する問題