繁体   English   中英

c中的逐行输入

[英]Line wise input in c

如何在c中执行以下输入限制?

第一行包含float,第二行包含float,第三行int,

在控制台中按Enter三次后,程序应该能够读取每一行并将内容分别放入int,int,float变量中。

三按Enter键后,程序不应等待用户输入并开始验证。

一些测试用例

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,但当我留空行时失败。

您应该始终检查scanf的返回值。

原因是,返回值是scanf用于传达转换错误以及其他错误的内容。 例如,如果您的程序告诉scanf期望使用十进制数字序列,并且scanf遇到与该模式不匹配的内容,则返回值将指示此失败。

返回的值将是成功分配的项目数。 例如,

char str[128];
int x, y = scanf("%d %127s", &x, str);

如果y为1,则应假定x是可以安全使用的。 如果y为2,则应假定xstr都可以安全使用。

这回答了部分问题。 下一部分是如何确保输入采用线的形式。 scanf并不严格处理 它处理其他单位,例如%d是编码为十进制数字序列(和符号)的int 十进制数字序列结束后,它将返回...无法保证十进制数字将占据整个行

实际上,这里存在两个问题:前导空格尾随空格。 [cCn之外,所有格式说明符都将导致前导空白被丢弃。 如果要以不同的方式处理前导空格,则需要整理一下如何处理前导空格。

考虑到丢弃用户输入几乎总是(如果不总是这样)一个坏主意。 如果您不在乎该行的其余部分,则可以使用诸如scanf("%*[^\\n]"); getchar(); 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 */
}

有了这些信息,如果您有任何问题,也许您可​​以尝试并用一些代码更新您的问题...

PS:我在您编写的代码中注意到,您似乎对%f%d感到困惑; %f用于读取float%d用于读取int ,而不是相反...

阅读行明智的输入后 ,我知道必须使用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'))...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM