gpt4 book ai didi

c - scanf函数的使用次数有限制吗?

转载 作者:行者123 更新时间:2023-11-30 19:55:30 25 4
gpt4 key购买 nike

为了重新回到 C 编程流程,我编写了一些简单的测试程序。我在 scanf 函数中遇到了一个奇怪的问题。我在下面的代码中有3个,但只有前2个被初始化;第三个 scanf 被忽略。这是正常现象,还是我做错了什么?我盯着这段代码看了半个小时,没有发现任何错误。

#include <stdio.h>

int math(int a, int b, char selection) {

int result;

switch (selection) {
case 'a':
result = a + b;
break;
case 's':
result = a - b;
break;
case 'm':
result = a * b;
break;
case 'd':
result = a / b;
break;
}

return result;
}

int main() {
int num1 = 0;
int num2 = 0;
int result = 0;
char selection;

printf("Enter first number: ");
scanf("%i", &num1);

printf("Enter second number: ");
scanf("%i", &num2);

printf("\n[a] Add\n[s] Subtract\n[m] Multiply\n[d] Divide\n\nWhich one: ");
scanf("%c", &selection);

result = math(num1, num2, selection);
printf("%i", result);

return 0;
}

最佳答案

回答您的总体问题:
scanf函数的使用次数有限制吗?

不,不,没有。

但无论如何,这并不是这里发生的事情。

当你做这样的事情时:

printf("Enter second number: ");
scanf("%i", &num2);

您实际上在 stdin 上输入两个值,第一个是数字,第二个是不可见的换行符。

                     you can't see that, but it's there
V
> Enter second number: 3\n

方式scanf()有效,它将读取来自 stdin 的输入并将其存储到您的变量中,直到它们全部填满,然后它将保留其余部分。在我的示例中,3 存储到 num2 中,并且 '\n' 保留在 stdin 上,然后当此代码运行时:

scanf("%c", &selection);

它将查看 stdin 并找到那里的换行符 ('\n')。它可以存储为字符类型,因此它将用它填充selection

解决此问题的一种方法是将代码更改为:

scanf(" %c", &selection);

% 之前的空格告诉 scanf 忽略 stdin 缓冲区开头的任何空格(包括换行符)。

<小时/>

关于调试的旁注:

当您认为出现问题时,可以使用调试器或打印一些值来给您信心和理解。例如,我会这样更新您的代码:

printf("\n[a] Add\n[s] Subtract\n[m] Multiply\n[d] Divide\n\nWhich one: ");
int ret = scanf("%c", &selection);

printf("Scanf I think failed. Return value is: %d. Selection is: %c (%d)\n",
ret, selection, selection);

您可以从手册页中找到返回值的含义。在 this case此处的返回代码将告诉您有多少项目已成功匹配和分配。您会在此处看到 1,因此您知道调用成功了。您的输出将如下所示:

Scanf I think failed. Return value is: 1. Selection is:
(10)

这告诉您 scanf 确实得到了某些东西,您没有看到打印的字符,但输出跳过了一行(可疑)并且 ASCII打印的值是 1010,查找它你会发现它是一个换行符。

关于c - scanf函数的使用次数有限制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20642851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com