如果用户按Enter键而不输入任何浮点值,我需要程序退出while循环。谢谢!
printf("Enter scores\n”);
float scores[10];
int n=0;
while (n<10){
scanf("%f", &scores[n]);
n++;
if (THE USER PRESSES ENTER WITHOUT ENTERING ANYTHING){break;}
}
答案 0 :(得分:3)
您可以使用fgets()
通过换行符将一行输入读入缓冲区,然后使用sscanf()
来解析缓冲区的内容。使用scanf()
的问题在于大多数转换说明符,特别是%f
转换说明符,会跳过前导空格,包括换行符。因此,如果您尝试给scanf()
一个空行,该函数将继续等待输入,直到您输入非空白字符。
以下代码将此技术应用于您的代码。变量n
已更改为size_t
类型变量,因为这是一个无符号类型,保证能够保存任何数组索引。此外,请注意fgets()
和sscanf()
都会返回应该检查的值。如果存在错误,fgets()
函数将返回空指针,并且下面的代码会输出错误消息并在出现这种情况时退出。 sscanf()
函数返回成功转换的次数,此值可用于确保输入符合预期。当用户输入一个空行或没有前导浮点值的行(前导空格是OK)时,返回零,并且输入循环被转义。
我添加了一些代码来显示输入到数组中的值。
#include <stdio.h>
#include <stdlib.h> // for exit()
int main(void)
{
float scores[10];
char buffer[100];
size_t n = 0;
printf("Enter scores\n");
while (n < 10){
if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
fprintf(stderr, "Error in fgets()\n");
exit(EXIT_FAILURE);
}
if (sscanf(buffer, "%f", &scores[n]) == 1) {
++n;
} else {
break;
}
}
for (size_t i = 0; i < n; i++) {
printf("scores[%zu] = %f\n", i, scores[i]);
}
return 0;
}
示例互动:
Enter scores
3.8
3.6
2.9
3.4
scores[0] = 3.800000
scores[1] = 3.600000
scores[2] = 2.900000
scores[3] = 3.400000
答案 1 :(得分:2)
将用户文本的输入与解析分开 以字符串形式读取用户输入的行;
char buffer[80];
if (fgets(buffer, sizeof buffer, stdin) == NULL) Handle_EOF();
现在,使用sscanf()
,strtod()
等解析字符串。
if (sscanf(buffer, "%f", &scores[n]) == 1) Handle_Successful_Float_Input(scores[n]);
else if (buffer[0] == '\n') Handle_Empty_Line();
else Handle_Everything_Else(buffer);
答案 2 :(得分:0)
fgets
是更好的路线,但如果必须使用scanf,则可以通过扫描字符来检测换行符。如果该字符不是换行符,请在输入中用{{1}}替换它,然后扫描浮点数。
ungetc
答案 3 :(得分:-1)
答案 4 :(得分:-2)
我们知道如果从输入中没有提取任何已定义的类型,scanf将返回负值。
所以:
printf("Enter scores\n”);
float scores[10];
int n=0;
while (n<10){
if(scanf("%f\n", &scores[n]) < 0) printf("Error! Error!");
n++;
}