C++ 在循环中输入数据

C++ 在循环中输入数据,c++,c,C++,C,我想按格式“%d:%c”输入数据 我有这个: #include <stdio.h> int main() { int number; char letter; int i; for(i = 0; i < 3; i ++) { scanf("%c:%d", &letter, &number); printf("%c:%d\n", letter, number); } } 但我的程序是这样

我想按格式“%d:%c”输入数据

我有这个:

#include <stdio.h>

int main() {
    int number;
    char letter;
    int i;

    for(i = 0; i < 3; i ++) {
        scanf("%c:%d", &letter, &number);
        printf("%c:%d\n", letter, number);
    }
}
但我的程序是这样做的:

a:1
a:1
b:2

:1
b:2

--------------------------------
Process exited with return value 0
Press any key to continue . . .

这里的问题是什么?

这是因为当您使用
scanf
读取输入时,输入字符仍留在缓冲区中,因此您下次调用
scanf
时,会将其读取为字符

通过告诉scanf
scanf
跳过空白,在格式代码中添加一个空格,可以很容易地解决这个问题,如

scanf(" %c:%d", &letter, &number);
/*     ^                */
/*     |                */
/* Notice leading space */

这是因为当您使用
scanf
读取输入时,回车字符仍保留在缓冲区中,因此您下次调用
scanf
时,会将其读取为字符

通过告诉scanf
scanf
跳过空白,在格式代码中添加一个空格,可以很容易地解决这个问题,如

scanf(" %c:%d", &letter, &number);
/*     ^                */
/*     |                */
/* Notice leading space */
这可能会有帮助。在scanf()函数中的%d之后使用%c会导致这样的困难

简而言之,您在给出第一个测试用例的数字输入后输入的“\n”将作为第二个测试用例的字符输入

为了避免这种情况,您可以将
scanf
语句编辑为
scanf(“%c:%d”,…)。%c之前的前导空格可避免将所有这些'\n'输入作为字符。

这可能会有所帮助。在scanf()函数中的%d之后使用%c会导致这样的困难

简而言之,您在给出第一个测试用例的数字输入后输入的“\n”将作为第二个测试用例的字符输入

为了避免这种情况,您可以将
scanf
语句编辑为
scanf(“%c:%d”,…)。%c之前的前导空格避免将所有这些'\n'输入作为字符。

OP说“…按格式“%d:%c”输入数据,但代码使用
%c:%d”
,数据输入意味着“char”然后是“number”

建议:

1) 确定所需的顺序

2) 在
“%c”
之前使用空格,如在
“%c”
中使用前导空格,如前一行的Enter(或
'\n'
)。

OP说“。。。按格式“%d:%c”输入数据,但代码使用
“%c:%d”
,数据输入意味着“char”然后是“number”

建议:

1) 确定所需的顺序


2) 在
%c”
之前使用空格,如在
%c”
中使用前导空格,如前一行的Enter(或
'\n'
)。

是否尝试在
扫描框中添加
\n
?是否尝试在
扫描框中添加
\n