如何在c?
中强制执行以下输入限制第一行包含float, 第二行包含float, 第三行int,
在控制台中按三次后,程序应该能够读取每一行并将内容放在各自的int,int,float变量中。
三次输入键后按下程序不应等待用户输入并开始验证。
一些测试用例
line1: 34
line2:4
line3:12
result: ok
line1:
line2:4
line3:12
result: not ok
line1: Hi
line2:4
line3:12
result: not ok
到目前为止,我使用了基础
scanf("%f",&p);
scanf("%f",&r);
scanf("%d",&t);
它适用于测试用例1和3,但在我留空线时失败。
答案 0 :(得分:2)
您应始终检查scanf
的返回值。
原因是返回值是scanf
用于传达转换错误以及其他错误的内容。例如,如果您的程序告诉scanf
期望一个十进制数字序列,并且scanf
遇到与该模式不匹配的内容,则返回值将指示此失败。
返回的值将是成功分配给的项目数。例如,
char str[128];
int x, y = scanf("%d %127s", &x, str);
如果y
为1,则应假定x
可以安全使用。如果y
为2,则应假定x
和str
都可以安全使用。
这回答了部分问题。接下来的部分是如何确保输入采用行的形式。 scanf
并未严格处理行;它涉及其他单位,例如%d
是int
编码为十进制数字序列(和符号);一旦十进制数字序列结束,它将返回...不能保证十进制数字将占据整行。
这里实际上有两个问题:引导和尾随空格。除[
,c
,C
和n
之外的所有格式说明符都将导致前导空格被丢弃。如果你想以不同的方式处理领先的空白,你需要编写你希望如何处理领先的空白。
考虑丢弃用户输入几乎总是(如果不总是)一个坏主意。如果您不关心该行的其余部分,您可以使用类似scanf("%*[^\n]"); getchar();
的内容来丢弃所有跟踪并包括'\n'
换行符的内容......第一个语句将尝试读取尽可能多的非换行符,第二个将丢弃终止换行符。但是,如果要确保输入占用整个行,则需要测试getchar
返回的值。
使用所有这些注意事项的示例:
/* Test for leading whitespace (including newlines) */
int c = getchar();
if (c != '-' && !isdigit(c)) {
/* Leading whitespace found */
}
ungetc(c);
/* Test for correct data conversion */
int x, y = scanf("%d", &x);
if (y != 1) {
/* Something non-numeric was entered */
}
/* Test for trailing newline */
c = getchar();
if (c != '\n') {
/* Trailing newline found */
}
有了这些信息,如果您有任何问题,也许您可以尝试用一些代码更新您的问题......
P.S。我注意到在您编写的代码中,您似乎混淆了%f
和%d
; %f
用于阅读float
s,%d
用于阅读int
s,而不是相反... {/ p>
答案 1 :(得分:0)
一旦我读到直线输入,我就知道必须使用fgets
+ sscanf
而不是直接scanf
。当然,您可以使用getc
/ getchar
作为解决方法,但是您可以找到极端情况,我发现fgets
+ sscanf
更清洁。在一行上单独获取浮动的示例:
char line[80], dummy[2];
float val;
if (fgets(line, sizeof(line), stdin) == NULL)...
if (sscanf(line, "%f%1s", &val, dummy) != 1)...
// Ok val was alone on the line with optional ignored blanks before and/or after
您还可以为loooong行添加测试:
if ((line[0] != 0) && (line[strlen(line)-1 != '\n'))...