如何在 scanf("%d%c"); 中只输入字符
How to input just character in scanf("%d%c");
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int input;
char ch;
scanf("%d%c", &input, &ch);
printf("%d %c", input, ch);
}
我只希望 ch 有一些字符并且输入有垃圾值。
所以我输入了 [q] 和 [enter]。
但是输出是[垃圾值?]。
我不知道为什么 ch 有'?'不是 'q'.
我的缓冲区发生了什么?
scanf("%d%c", &input, &ch);
对于输入 "q"
,scanf 将尝试将 'q'
解释为整数的第一个字符(对于 "%d"
转换)并失败... scanf()
return 立即使用值 0
并且不更改 ch
的值(input
的值不确定)。
"q"
仍在输入缓冲区中,为下一个输入操作做好准备。
始终 检查 scanf()
的 return 值
int chk = scanf("%d%c", &value, &ch);
switch (chk) {
default: /* this didn't happen */;
/* let the compiler writers know about this */
break;
case EOF: /* error */;
/* value unchanged */
/* ch unchanged */
break;
case 0: /* no input found */;
/* value indeterminate */
/* ch unchanged */
break;
case 1: /* no input for ch found */;
/* value ok; (possibly) changed */
/* ch indeterminate */
break;
case 2: /* all ok */;
/* value ok; (possibly) changed */
/* ch ok; (possibly) changed */
break;
}
这是一个很好的例子,说明了为什么您应该 always check the return value of scanf
(以及相关函数)。
您提供给 scanf
("%d%c"
) 的格式字符串需要一个有效的十进制数作为输入(紧接着)一个字符。如果您自己输入 q
,该函数将无法读取十进制值并在该点停止 – 返回 0
,因为 none 个参数已成功赋值。在这种情况下,input
或 ch
都不会有可预测的值,因为您还没有初始化。
另请注意,如果您在 中键入 一个数字(即 12
),则终止换行符(从 Enter 键) 将分配给 ch
.
这是您的代码,添加了输入检查并为您的两个变量分配了默认值:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main(void)
{
int input = 42;
char ch = '$';
if (scanf("%d%c", &input, &ch) != 2) {
printf("Error: Please input a number and a character!\n");
}
printf("%d %c", input, ch);
return 0;
}
或者,如果(正如我认为您在问题中建议的那样),您仍想读取 ch
值但将 input
保留为其原始 ('trash') 值,您可以重新读取输入 if/when 第一次调用 scanf
失败。在第二次调用中,删除 %d
格式说明符:
int main(void)
{
int input = -137; // Let's use this as a 'trash' value.
char ch = '$';
if (scanf("%d%c", &input, &ch) != 2) {
if (scanf("%c", &ch) != 1) printf("Error: Failed to read anything!");
}
printf("%d %c", input, ch);
return 0;
}
#include <stdio.h>
int main(void) {
int input;
char ch;
scanf("%c%d", &input, &ch);
printf("%c %d",ch, input);
}
此代码仅给出垃圾值作为输出,没有其他任何内容。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int input;
char ch;
scanf("%d%c", &input, &ch);
printf("%d %c", input, ch);
}
我只希望 ch 有一些字符并且输入有垃圾值。
所以我输入了 [q] 和 [enter]。
但是输出是[垃圾值?]。
我不知道为什么 ch 有'?'不是 'q'.
我的缓冲区发生了什么?
scanf("%d%c", &input, &ch);
对于输入 "q"
,scanf 将尝试将 'q'
解释为整数的第一个字符(对于 "%d"
转换)并失败... scanf()
return 立即使用值 0
并且不更改 ch
的值(input
的值不确定)。
"q"
仍在输入缓冲区中,为下一个输入操作做好准备。
始终 检查 scanf()
int chk = scanf("%d%c", &value, &ch);
switch (chk) {
default: /* this didn't happen */;
/* let the compiler writers know about this */
break;
case EOF: /* error */;
/* value unchanged */
/* ch unchanged */
break;
case 0: /* no input found */;
/* value indeterminate */
/* ch unchanged */
break;
case 1: /* no input for ch found */;
/* value ok; (possibly) changed */
/* ch indeterminate */
break;
case 2: /* all ok */;
/* value ok; (possibly) changed */
/* ch ok; (possibly) changed */
break;
}
这是一个很好的例子,说明了为什么您应该 always check the return value of scanf
(以及相关函数)。
您提供给 scanf
("%d%c"
) 的格式字符串需要一个有效的十进制数作为输入(紧接着)一个字符。如果您自己输入 q
,该函数将无法读取十进制值并在该点停止 – 返回 0
,因为 none 个参数已成功赋值。在这种情况下,input
或 ch
都不会有可预测的值,因为您还没有初始化。
另请注意,如果您在 中键入 一个数字(即 12
),则终止换行符(从 Enter 键) 将分配给 ch
.
这是您的代码,添加了输入检查并为您的两个变量分配了默认值:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main(void)
{
int input = 42;
char ch = '$';
if (scanf("%d%c", &input, &ch) != 2) {
printf("Error: Please input a number and a character!\n");
}
printf("%d %c", input, ch);
return 0;
}
或者,如果(正如我认为您在问题中建议的那样),您仍想读取 ch
值但将 input
保留为其原始 ('trash') 值,您可以重新读取输入 if/when 第一次调用 scanf
失败。在第二次调用中,删除 %d
格式说明符:
int main(void)
{
int input = -137; // Let's use this as a 'trash' value.
char ch = '$';
if (scanf("%d%c", &input, &ch) != 2) {
if (scanf("%c", &ch) != 1) printf("Error: Failed to read anything!");
}
printf("%d %c", input, ch);
return 0;
}
#include <stdio.h>
int main(void) {
int input;
char ch;
scanf("%c%d", &input, &ch);
printf("%c %d",ch, input);
}
此代码仅给出垃圾值作为输出,没有其他任何内容。