2017-09-17 20 views
-2

私はプログラミングの初心者であり、2つの数字の和または積を与える基本的な電卓を試してみようと考えていました。しかし、このプログラムのwhileループでは、最初のprintfはループの最初の繰り返しの後に2回印刷されているようです。これを是正する助けがあれば幸いです。printfはwhileループで2回発生しますか?

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

int multiply(int a, int b) { 
    return a * b; 
} 

void printMultiply(int x, int y) { 
    int result = multiply(x, y); 
    printf("\n%d\n", result); 
} 

int add(int a, int b) { 
    return a + b; 
} 

void printAdd(int x, int y) { 
    int result = add(x, y); 
    printf("\n%d\n", result); 
} 

int main() { 
    int product1 = 0; 
    int product2 = 0; 

    int sum1 = 0; 
    int sum2 = 0; 

    while (true) { 
     // this prints twice after first iteration? 
     printf("Would you like to add or multiply? (press a or m)\n"); 

     char choice = ' '; 
     scanf("%c", &choice); 

     if (choice == 'm') { 
      printf("What two numbers would you like to multiply? (leave a space between numbers\n"); 
      scanf("%d%d", &product1, &product2); 
      printMultiply(product1, product2); 
     } else 
     if (choice == 'a') { 
      printf("What two numbers would you like to add? (leave a space between numbers\n"); 

      scanf("%d%d", &sum1, &sum2); 
      printAdd(sum1, sum2); 
     } 
    } 
} 
+0

おそらく、あなたが知っている選択肢の中にループしないので、scanfから改行が当たったでしょう。 –

+0

'scanf(...)'は見えないリターン文字に反応しています。 'return'(_newline_)文字を使うためにフォーマット文字列の前にスペース文字を入れてみてください:' scanf( "%c"、&choice); ' – ryyker

答えて

3

最初の反復の後、あなたはscanfにあなたの最初の呼び出しでの改行(\nを)見ています。

すべてを行う必要が任意の空白を食べるためにあなたのフォーマット文字列で先頭にスペースを使用している:

scanf(" %c", &choice); 
+0

それは私が理解するのが奇妙です。私はstd :: cinを使ってこれを問題なく動作させました。これが私を投げました。したがって、2つの数字の後に「Enter」キーを押すと、次回のスキャンで自動的に\ nが読み取られます。 – Njgardner90

+0

はい。あなたは改行文字をどこかで消費する必要があります。これは 'scanf'と共通の問題です。 – smarx

0

「\ n」の第一反復の後にCHに入力されます。 バッファから削除します。

scanf( "%d%d"、& sum1、& sum2);

scanf( "%c"、& enter);これはあなたの問題を整理します

scanf("\n%c", &choice); 

0

はこれを試してみてください。

関連する問題