2016-07-12 5 views
0

私は演算子(+、 - 、/、*のいずれか)をユーザーに与えようとしています。彼/彼女はこれを行い確実にするために、私はこのコードを書いた:strcmp() - コードがコンパイルされても問題なく動作しているようです。

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



int main(void) 
{ 
char operator; 

printf("Enter operator: (+, -, *, /) \n"); 

do { scanf("%c", &operator); } 
while ((strcmp(&operator, "+") != 0) || (strcmp(&operator, "-") != 0) || (strcmp(&operator, "*") != 0) || (strcmp(&operator, "/") != 0)); 
} 

何が起こって終わると、ループは、私が正しい演算子を入力しても、延々と続くされます。どんな助けもありがとうございます。感謝:)

編集:(固定コード)

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



int main(void) 
{ 
char operator; 

printf("Enter operator: (+, -, *, /) \n"); 

    do { scanf(" %c", &operator); } 
while ((strcmp(&operator, "+") != 0) && (strcmp(&operator, "-") != 0) && (strcmp(&operator, "*") != 0) && (strcmp(&operator, "/") != 0)); 

} 
+4

'strcmp'がゼロで終了する文字列ではなく、文字を取る示唆しています。これは 'if(operator == '+')' –

+0

@WeatherVaneのように簡単なことができます。あなたのコメントは答えに変換する価値があります。 –

+0

私は、 'char'の内部表現が整数型であるという事実を利用することもできると思います。したがって、このような値を比較するために比較を簡素化することができます。' operator!= 42' –

答えて

3

関数strcmpは、文字ではなくゼロで終了する文字列を受け取ります。そのため、

strcmp(&operator, "+") 

の使用は未定義の動作の原因です。

あなたのコードは、私も&&||を変更お知らせ

while ((operator != '+') && ...) 

ような単純なものでした。

" %c"のように、"%c"の前にスペースが必要です。入力ループが繰り返されると、入力バッファに残っているnewlineがクリアされるようになります。

EDIT:あなたは右の補正を行っているようには見えませんが、私は

do { 
    scanf(" %c", &operator); 
} while (operator != '+' && operator != '-' && operator != '*' && operator != '/'); 
+0

それは間違いなく働いた。なぜ&&は働いていて、|| ? –

+0

'||'を使うと、演算子がそれらのシンボルのどれかと等しくない場合にループが繰り返され、それらのシンボルの1つにしか等しくないことがあるので、 –

+0

@ManuelStoilovあなたはあなたの質問を編集しました。解決策ではありません。私の編集をご覧ください。 –

0

変数オペレータに次のよう

char operator[2] = { '\0' }; 

そして

do { scanf("%c ", operator); } 
while ((strcmp(operator, "+") != 0) && (strcmp(operator, "-") != 0) && (strcmp(operator, "*") != 0) && (strcmp(operator, "/") != 0)); 
} 

が、その代わりに考慮してくださいように使用を宣言しますたくさんのを使用するstrcmpあなたは1つの機能を使用することができましたstrchr

+0

それは動作しますが、ほとんど意図的に難読化されているようです。比較演算子== '+'は、より読みやすく、効率的で、煩わしさが少なくなります。 (単一のライブラリ関数ですべての比較を行うには 'strchr'の使用について言及することができます) – rici

+0

@rici Nothinhはoperator [0] == '+'のような比較を使用できないようにします。さらに、私は多くの比較の代わりに標準関数strchrを使う方が良いと指摘しました。私はstrcmpの使い方を正しく示しました。 –

関連する問題