whilef循环中的printf打印两次而不是一次

时间:2018-11-20 18:15:03

标签: c while-loop printf do-while

在此代码中,需要计算操作符出现的次数。 它不会计算,并且在运行代码时会打印两次“请输入注释。请按Q:”,我不知道怎么了。

#include <stdio.h>

int main(void)
{

    char note;
    int result1 = 0, result2 = 0, result3 = 0, result4 = 0;


    do
    {
        printf("Please enter a note. to finish press Q:\n");
        scanf("%c", &note);
        switch (note)
        {
        case'+':
            result1 = result1 + 1;
            break;
        case'-':
            result2 = result2 + 1;
            break;
        case'*':
            result3 = result3 + 1;
            break;
        case'/':
            result4 = result4 + 1;
            break;
        }

    } while (note != 'Q');

    printf("+ appears %d times\n", result1);
    printf("- appears %d times\n", result2);
    printf("* appears %d times\n", result3);
    printf("/ appears %d times\n", result4);

    system("pause");
}

2 个答案:

答案 0 :(得分:0)

要调试,请插入

  printf("note='%c'\n", note);

在扫描后立即。 您会立即发现问题。

答案 1 :(得分:0)

使用scanf("%c", %c),您将一次读取一个字符。没关系,但是..

scanf不会“重新扫描”输入,直到清除缓冲区。

因此,如果用户输入的字符长于1个字符,则循环将对字符串长+ 1(\n被视为字符)的每个字符进行迭代。

示例(请注意,它会循环3次+,+,\n):

Please enter a note. to finish press Q:
++
Please enter a note. to finish press Q:
Please enter a note. to finish press Q:
Please enter a note. to finish press Q:

这就是窍门。您需要更改代码以适应此情况(即,隐藏请输入消息直到为空,或者读取一个字符数组note[128]... scanf('%s', note)与单个字符以及带有子循环以遍历输入的迭代,等等)。