使用scanf查询问题,允许用户跳过问题

时间:2011-08-07 22:32:17

标签: c input integer enter

我正在为C编程课程做最后的项目。该项目旨在建立一个存储药物信息的数据库。我已经完成了所有的元素,现在只需要对所有元素进行微调。

项目中需要用户可以更改药物信息的功能。在要求中,用户应该能够通过按Enter键跳过一个字段。例如,用户可以改变药物的生产者和数量。如果用户不想更改生产者,他们会点击输入并移动到数量。

我环顾互联网并且能够让用户跳过为制作人输入字符串。但是,我无法使用整数。

这是我使用的,以便用户可以跳过输入字符串:

scanf("%30[^\n]", fentry[found].producer);

为清楚起见,fentry.producer是一个包含30个字符的字符串,它是一个整数变量。

我尝试用整数输入做类似的事情(编辑:通过整数输入,我指的是输入数量的那个,而不是'找到'变量)。它会让你跳过输入的内容,但是如果你确实输入了某些东西,它会存储一个随机值。

任何人都知道如何解决这个问题?

5 个答案:

答案 0 :(得分:3)

使用scanf()而不是使用fgets(),从用户获取交互式输入的更好方法。此函数获取完整的输入行,直到用户按Enter键的位置,并返回它以便您可以解析它。

如果您愿意,可以使用sscanf()来读取信息。 sscanf()几乎与scanf()完全相同,只是它从字符串而不是标准输入中读取数据。

答案 1 :(得分:0)

这个怎么样?

char s[50];
fgets(s, 50, stdin);

if(s[0] != '\n') {
    fentry[found].producer = atoi(s);
}

你必须删除s中的所有空格。

答案 2 :(得分:0)

您是否在scanf之前将整数初始化为0?

答案 3 :(得分:0)

scanf("%29s", fentry[found].producer); while('\n'!=getchar());

这完全适用,严格遵守ANSI C,max。便携。 清除输入缓冲区,支持chararray-length,chararray包含(终止)'\ 0'(不需要初始化),并且您的数组不包含用户输入中的'\ n'。

答案 4 :(得分:0)

我怀疑键盘缓冲区导致代码中出现问题。第一次调用代码时,它将读取最多30个字符 - 只要它们不是NEWLINE字符。他们会在阅读NEWLINE时终止。 NEWLINE将保留在缓冲区中。

但是......如果再次以相同的方式调用scanf,则上一次调用的NEWLINE仍将位于键盘缓冲区中。在从键盘请求更多输入之前将读取此信息。 NEWLINE将立即失败scanf模式,char数组将不会更新,并且您将被留给指向未初始化的内存区域的char指针。