繁体   English   中英

scanf正在跳过扫描

[英]scanf is skipping scans

我正在用C编写带有多个scanfs的程序,但是运行它时,每当我进入读取整数值的扫描时,它都会跳过它并放入一个不同的值,从而开始执行无穷循环。 我什至尝试将每个scanfs分成多个函数,并且发生相同的事情。 我绝对不知道什么是错的,或者该怎么做。

检查返回值。 C库函数出于某种原因返回状态代码。

人们用scanf遇到的主要问题是数据不是他们期望的。 这可能会导致部分扫描,使您处于文件中意外的位置以备将来扫描。 可能是导致无限循环的原因,通常可以通过确保返回值是您期望的值(尝试扫描的项目数)来检测到它。 如果不看代码,很难说出来。

C99在7.19.6.4 The scanf function节中7.19.6.4 The scanf function

如果在任何转换之前发生输入失败,则scanf函数将返回宏EOF的值。 否则,scanf函数将返回分配的输入项数,如果早期匹配失败,该数目可能少于所提供的输入项数,甚至为零。

但是,几乎总是应该将输入检索为 ,然后使用sscanf从那里进行处理,因为这是一种简单的方法,可以尝试对输入数据进行多次扫描以查找不同格式的字符串,以进行多次扫描以找出哪种格式的字符串。线在。

例如,以下代码是通过缓冲区溢出保护检测以及缓冲区清除来检索用户输入的安全方法,因此多余的输入不会影响下一个输入操作:

#include <stdio.h>
#include <string.h>

#define OK       0
#define NO_INPUT 1
#define TOO_LONG 2
static int getLine (char *prmpt, char *buff, size_t sz) {
    int ch, extra;

    // Get line with buffer overrun protection.
    if (prmpt != NULL) {
        printf ("%s", prmpt);
        fflush (stdout);
    }
    if (fgets (buff, sz, stdin) == NULL)
        return NO_INPUT;

    // If it was too long, there'll be no newline. In that case, we flush
    // to end of line so that excess doesn't affect the next call.
    if (buff[strlen(buff)-1] != '\n') {
        extra = 0;
        while (((ch = getchar()) != '\n') && (ch != EOF))
            extra = 1;
        return (extra == 1) ? TOO_LONG : OK;
    }

    // Otherwise remove newline and give string back to caller.
    buff[strlen(buff)-1] = '\0';
    return OK;
}

您可以通过以下方式调用此代码:

char buff[50];
int rc = getLine ("What?> ", buff, sizeof(buff));
if (rc != OK) {
    // Error condition, either EOF or to long.
}
// Now use sscanf on buff to your heart's content,
//   remembering to check the return value.

如果您正在从stdin中读取,则scanf将从按回车键结束的缓冲区中读取。

第一个scanf将接受您要查找的内容,但其余缓冲区将保留。

对于代码:

int num;
scanf("%d", &num);

并输入:

1 2 3 4 5

num将为5,正如预期的那样。

2 3 4 5

仍然会在缓冲区中,因此您运行的下一个scanf不会提示您输入其他内容,而是将其作为输入。

您的scanf可能正在从先前的缓冲区读取残留数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM