gpt4 book ai didi

c - 为什么我的第二个 "scanf"被跳过?

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

这是我的主要功能..

    printf("How many marking components in the course? ");
scanf("%d", &numberOfComponents );
for (int i=0; i<numberOfComponents; i++){

char c[MAX_STR];
printf("enter next component name: ");
fgets(c, sizeof(c), stdin);
scanf(c, " %c", &c);


Component comp;

initComp(&comp, c);
class.comps[i] = comp;

}

printf("How many marking schemes? ");
scanf(" %d", &numberOfSchemes);

我已经尝试了空白,但它仍然存在

最佳答案

您应该测试您的输入操作是否有效;如果你不这样做,事情就会变得困惑。

此电话至scanf() :

scanf(c, " %c", c);

应该(如 chux 在他的 answer 中的诊断)以不同的方式写,但我认为它应该更像:

char filler;
if (scanf(" %c", &filler) != 1)
…report problem…

原始版本使用刚刚读取的行作为格式字符串,几乎肯定无法匹配第二个输入。如果你只是使用scanf(" %c", c) ,这是最简单的编辑,然后用下一个非空白字符覆盖输入行的第一个字符。

接下来的问题是为什么要让用户在组件名称后输入额外的数据。他们必须输入一些东西。上下fgets() ,代码将从第一个字符之后读取到下一个换行符。因此,如果您输入:

component-1
component-2

第一个fgets()会读 component-1和换行符; scanf()修改后的内容为 ccomponent-2进入c[0] ,然后是下一个fgets()会读 omponent-2将换行符添加到 c在下一次迭代中。

通过添加代码来打印您阅读的内容,您可以看到更多正在发生的事情:

printf("Line 1: [[%s]]\n", c);  // after the fgets()
printf("Line 2: [[%s]]\n", c); // after the scanf()

这是最基本的调试技术之一;回显您所读到的内容,以确保程序获得了您认为获得的数据。

关于c - 为什么我的第二个 "scanf"被跳过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26416350/

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