gpt4 book ai didi

c - c中的逐行输入

转载 作者:太空宇宙 更新时间:2023-11-04 08:23:52 24 4
gpt4 key购买 nike

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

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

在控制台中按 enter 三次后,程序应该能够读取每一行并将内容放入相应的 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,但当我留下一个空行时失败。

最佳答案

您应该始终检查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(); 丢弃尾随 '\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 */
}

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

附言我注意到在您编写的代码中,您似乎混淆了 %f%d%f 用于读入 float,而 %d 用于读入 int,而不是其他一路走来……

关于c - c中的逐行输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31890068/

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