如何检查用户是否在scanf中输入空行c

如何检查用户是否在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;} 

} 
+0

当你开始编写真实的东西时,你必须避免使用'scanf()'。 –

+0

我会尝试获取() – mosh442

+5

@ mosh442:绝对不是'gets()'! SO是一个健康的生活场所,使用'gets()'就像它不健康一样。现在,'fgets()'完全是另外一回事了。 –

我们知道,如果没有从输入中提取定义的类型,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++; 
} 

http://www.cplusplus.com/reference/cstdio/scanf/

+1

但它不会因为看到换行而停止查看。 – rici

+2

'scanf()'只有在任何匹配之前达到文件结束时才返回'EOF'。但是,当遇到第一个不匹配时,会返回'scanf()',或者到达文件结尾。因此,如果不进行转换,则返回0,除非达到eof。你应该测试'scanf()!= 1'。而且,'%f'转换跳过了包括换行符在内的主要空白。 –

+0

@DavidBowling添加缺少的\ n。 – bearaqua

我想。你想检查一个整数是否被分配了一个值? 实际上,您必须初始化变量,否则它将包含在该内存位置发生的任何事情,除非它被声明为全局变量。如果你没有得到,然后检查 this might help you with your question

+1

该代码正在读取浮点数,而不是整数。我想你已经错过了这个问题的要点 - 这是关于在使用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); 
+1

@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; 
}