scanf正在跳过扫描
我正在用C编写一个具有多个扫描的程序,但在运行它时,每当我到达一个读取整数值的扫描时,它就会跳过它并放入一个不同的值,开始执行一个无休止的循环。我甚至尝试过将每个scanf分离成多个函数,同样的事情也发生了。我完全不知道出了什么问题,也不知道该怎么办。检查返回值。C库函数返回状态代码是有原因的。检查返回值。C库函数返回状态代码是有原因的。人们使用scanf遇到的主要问题是数据不是他们期望的。这可能导致部分扫描,使您在文件中处于意外的位置,以便将来进行扫描。这可能是导致无限循环的原因,您通常会通过确保返回值是您期望的值(您尝试扫描的项目数)来检测无限循环。不看代码就有点难说 C99在第7.19.6.4节中规定了扫描功能: 如果在任何转换之前发生输入故障,scanf函数将返回宏EOF的值。否则,scanf函数将返回分配的输入项的数量,如果早期匹配失败,该数量可能会小于提供的数量,甚至为零 但是,几乎无一例外地,输入应该作为行进行检索,然后使用scanf正在跳过扫描,c,scanf,C,Scanf,我正在用C编写一个具有多个扫描的程序,但在运行它时,每当我到达一个读取整数值的扫描时,它就会跳过它并放入一个不同的值,开始执行一个无休止的循环。我甚至尝试过将每个scanf分离成多个函数,同样的事情也发生了。我完全不知道出了什么问题,也不知道该怎么办。检查返回值。C库函数返回状态代码是有原因的。检查返回值。C库函数返回状态代码是有原因的。人们使用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;
}
人们使用scanf时遇到的主要问题是数据不是他们所期望的。这可能导致部分扫描,使您在文件中处于意外的位置,以便将来进行扫描。这可能是导致无限循环的原因,您通常会通过确保返回值是您期望的值(您尝试扫描的项目数)来检测无限循环。不看代码就有点难说 C99在第7.19.6.4节中规定了扫描功能: 如果在任何转换之前发生输入故障,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;
}
如果您正在从stdin读取数据,则scanf将从按return键时结束的缓冲区中读取数据 第一个scanf将接收您正在寻找的内容,但剩余的缓冲区将保留 代码:
int num;
scanf("%d", &num);
和输入:
1 2 3 4 5
num将如预期的那样为5。但是
2 3 4 5
仍将在缓冲区中,因此您运行的下一个scanf不会提示输入其他输入,而是将其作为输入
您的scanf可能正在从以前的缓冲区读取剩余数据。如果您正在从stdin读取数据,则scanf将从按return键时结束的缓冲区读取数据 第一个scanf将接收您正在寻找的内容,但剩余的缓冲区将保留 代码:
int num;
scanf("%d", &num);
和输入:
1 2 3 4 5
num将如预期的那样为5。但是
2 3 4 5
仍将在缓冲区中,因此您运行的下一个scanf不会提示输入其他输入,而是将其作为输入
您的scanf可能正在从以前的缓冲区读取剩余数据。您介意发布一些代码吗?也许您可以尝试发布您的代码和一些带有结果的示例输入,以帮助人们准确了解您在做什么?您介意发布一些代码吗?也许您可以尝试发布您的代码和带有结果的示例输入,以提供帮助人们确切地了解你在做什么?令人惊讶的答案是,在报告中几乎没有提供任何信息question@Matthew,我擅长在每天早餐前做6件不可能的事情。或者,正如我妻子所指出的,一旦我开始说话,除了热核弹头之外,没有什么能让我闭嘴:-)令人惊讶的答案,因为当时几乎没有提供任何信息question@Matthew,我擅长在每天早餐前做6件不可能的事情。或者,正如我妻子所指出的,一旦我开始说话,除了热核弹头,没有什么能让我闭嘴:-)