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

问题描述 投票:0回答:5

如果用户按 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;
}
c while-loop scanf
5个回答
5
投票

您可以使用

fgets()
通过换行符将一行输入读取到缓冲区中,然后使用
sscanf()
解析缓冲区的内容。使用
scanf()
的问题是大多数转换说明符,特别是
%f
转换说明符,会跳过前导空格,包括换行符。因此,如果您尝试为
scanf()
提供一个空行,该函数将继续等待输入,直到您输入非空白字符。

下面的代码使这种技术适应您的代码。变量

n
已更改为
size_t
类型变量,因为这是保证能够保存任何数组索引的无符号类型。此外,请注意
fgets()
sscanf()
都返回应检查的值。如果出现错误,
fgets()
函数将返回空指针,如果发生这种情况,下面的代码将打印一条错误消息并退出。
sscanf()
函数返回成功转换的次数,该值可用于确保输入符合预期。当用户输入空行或没有前导浮点值的行(前导空白即可)时,将返回零,并转义输入循环。

我添加了一些代码来显示输入到数组中的值。

#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

2
投票

将用户文本的输入与解析分开。
将用户输入的line读取为字符串;

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);

0
投票

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

-1
投票

我想。你想检查一个整数是否被赋值? 实际上,您必须初始化变量,否则它将包含该内存位置发生的任何情况,除非将其声明为全局变量。如果您没有收到,请检查 这可能会帮助您解决问题


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

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

© www.soinside.com 2019 - 2024. All rights reserved.