我正在为C编程课程做最后的项目。该项目旨在建立一个存储药物信息的数据库。我已经完成了所有的元素,现在只需要对所有元素进行微调。
项目中需要用户可以更改药物信息的功能。在要求中,用户应该能够通过按Enter键跳过一个字段。例如,用户可以改变药物的生产者和数量。如果用户不想更改生产者,他们会点击输入并移动到数量。
我环顾互联网并且能够让用户跳过为制作人输入字符串。但是,我无法使用整数。
这是我使用的,以便用户可以跳过输入字符串:
scanf("%30[^\n]", fentry[found].producer);
为清楚起见,fentry.producer是一个包含30个字符的字符串,它是一个整数变量。
我尝试用整数输入做类似的事情(编辑:通过整数输入,我指的是输入数量的那个,而不是'找到'变量)。它会让你跳过输入的内容,但是如果你确实输入了某些东西,它会存储一个随机值。
任何人都知道如何解决这个问题?
答案 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指针。