如何检查用户是否在scanf中输入空行c
如果用户按Enter键而不输入任何浮点值,则需要程序退出while循环。谢谢!如何检查用户是否在scanf中输入空行c
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;}
}
我们知道,如果没有从输入中提取定义的类型,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++;
}
我想。你想检查一个整数是否被分配了一个值? 实际上,您必须初始化变量,否则它将包含在该内存位置发生的任何事情,除非它被声明为全局变量。如果你没有得到,然后检查 this might help you with your question
该代码正在读取浮点数,而不是整数。我想你已经错过了这个问题的要点 - 这是关于在使用scanf()函数系列时检测何时输入空行的问题。 –
您可以使用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
单独的输入。
阅读用户输入的行作为字符串;
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);
@DavidBowling有时OP像简洁的答案,有时冗长。它是一款投币式游戏,适合人们使用。 – chux
fgets
是更好的路线,但如果必须使用的scanf,换行可以通过扫描一个字符来检测。如果该字符不是换行符,则用ungetc
将其替换为输入,然后扫描该浮点数。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 10
int main (void) {
char i = '\0';
int n = 0;
int result = 0;
float scores[SIZE] = { 0.0f};
printf ("enter scores\n");
while (n < SIZE && (scanf("%c",&i) == 1)) {//scan a character
if (i == '\n') {
break;//newline so leave loop
}
else {
ungetc (i, stdin);//replace the character in input stream
}
if ((result = scanf ("%f", &scores[n])) == 1) {//scan a float
printf (" score[%d] entered as %f\n", n, scores[n]);
n++;
}
if (result == 0) {
printf ("please enter a number\n");//could not scan the input as a float
}
while ((result = getchar ()) != '\n') {//clean the input stream
if (result == EOF) {
fprintf (stderr, "problem EOF\n");
return 1;
}
}
printf ("enter score[%d]\n", n);
}
return 0;
}
当你开始编写真实的东西时,你必须避免使用'scanf()'。 –
我会尝试获取() – mosh442
@ mosh442:绝对不是'gets()'! SO是一个健康的生活场所,使用'gets()'就像它不健康一样。现在,'fgets()'完全是另外一回事了。 –