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

时间:2017-02-16 04:34:27

标签: c

如果用户按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;}

}

5 个答案:

答案 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)

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

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

请参阅http://www.cplusplus.com/reference/cstdio/scanf/