如何在 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 个参数已成功赋值。在这种情况下,inputch 都不会有可预测的值,因为您还没有初始化。

另请注意,如果您在 中键入 一个数字(即 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);

}

此代码仅给出垃圾值作为输出,没有其他任何内容。