使用fscanf:在输入中查找字符

使用fscanf:在输入中查找字符,c,loops,if-statement,while-loop,scanf,C,Loops,If Statement,While Loop,Scanf,在为即将到来的作业做一些练习时,我在使用fscanf时遇到了一个问题,并试图在程序中输入不正确的格式时抛出一个通知。我很确定我必须使用fscanf的返回,但是我不知道如何在while循环中使用它。目前,当输入诸如“a3”之类的值时,程序会连续循环,但“3e”几乎可以正常工作,只是它会两次输出数字3 工作scanf代码: int intGet( int min, int max ) { int input = 0; char temp = ' '; printf("Enter a number

在为即将到来的作业做一些练习时,我在使用fscanf时遇到了一个问题,并试图在程序中输入不正确的格式时抛出一个通知。我很确定我必须使用fscanf的返回,但是我不知道如何在while循环中使用它。目前,当输入诸如“a3”之类的值时,程序会连续循环,但“3e”几乎可以正常工作,只是它会两次输出数字3

工作scanf代码:

int intGet( int min, int max ) {

int input = 0;
char temp = ' ';
printf("Enter a number in between [%d-%d]: ", min, max);

if (scanf("%d%c", &input, &temp) != 2){
    errorNo = 1;
    return EXIT_FAILURE;
}
if (temp != '\n'){
    errorNo = 2;
    return EXIT_FAILURE;
}
if (input < min || input > max){
    errorNo = 3;
    return EXIT_FAILURE;
}
else {
    printf("Read %d\n", input);
}
return EXIT_SUCCESS;
此代码中使用的02_num.txt文件,前两个数字是在另一个函数中读取的最小值和最大值

1 15 //min and max
23 
45 
67 
8990  
3e 
12 
a3  
我尝试使用if/while循环的内容:

定义一个变量以记录fscanf的返回值(当前最接近的值):

检查if语句中的返回值(扫描文件两次,但输出不正确):


如果我遗漏了什么信息,请告诉我,我只是有点被困在这里。。在过去的几天里一直都是这样。可能只是一个愚蠢的错误,我错过了,但提前谢谢

循环的问题是当
fscanf
返回零时您会做什么。除其他外,这意味着如果您使用相同的格式字符串再次调用
fscanf
,结果将为零,因为导致您首先得到零的输入问题尚未解决


当从
fscanf
返回零时,您需要添加跳过该行的代码-例如,您的
fscanf(fp,“%*[^\n]”;fscanf(fp,“%*1[\n]”,将起作用。

首先,如果您想阅读整行,为什么不使用例如
fgets
而不是
scanf
?其次,大多数
scanf
格式说明符(例如所有数字格式)读取并丢弃前导空格。读取
a3
时,
%d
a
上失败,然后下一次尝试在
a
上失败,下一次尝试也失败。
3e
案例之所以有效,是因为
%c
读取
e
,而下一次迭代中的
%d
跳过了空白(换行符)。不要对基于行的输入使用
scanf()
等;它不关心线的边界。使用
fgets()
(或
getline()
)和
sscanf()
。@JoachimPileborg我知道fgets会更好地工作,但目标是熟悉更原始的I/O形式。在这种情况下,我仅限于fscanfI不会称
scanf
(和family)“更原始”,事实上恰恰相反。没有任何其他I/O函数像fscanf
那样对输入进行如此多的处理。如果您想要更多“原始”形式的I/O,您可以直接使用低级平台特定的I/O函数。请注意,格式字符串中的尾随
\n
(或任何尾随空白)将读取空白(包括换行符),直到遇到非空白的内容。如果输入是交互式的,那就太可怕了。我相信最好使用
%*[\n]
;这是对单个换行符的非赋值读取。唯一的问题是您无法判断
%*[\n]
是否实际匹配-它不计入返回值。(OTOH:这不太重要-只有在没有最后换行符的情况下,它才能在EOF上失败。)(我删除了我的“有趣(特殊)”注释-在空行上,
scanf()
失败(没有字符满足
“%*[^\n]]*1[\n]”
在一条空行上。我松了一口气;修复我思想中的错误要比修复操作系统中的错误容易得多。)这应该很快就会过去。
fscanf(fp,“%*[^\n]]%*1[\n]”;
如果读取的第一个字符不是
'\n'
。使用可选的前导非
'\n'
的简单修复方法是
fscanf(fp,%*.[\n]>);fscanf(fp,“%*1[\n]”;
@chux感谢您的评论!
*****************************************************
       Entry    Invalid    Valid    Number
         1         *                  32
*****************************************************
// adds invalid and valid entry totals, displays then here, adds totals of valid numbers and also outputs them here.
1 15 //min and max
23 
45 
67 
8990  
3e 
12 
a3  
while (check != EOF){

check = fscanf(fp, "%d%c", &input, &temp);
    if (check != 2){
        counterInvalid += 1;
        entry += 1;
        printf("%d\t*\t\t%d\tIncorrect Format\n", entry, input);
    }
while (fscanf(fp, "%d", &input) != EOF){

    if (fscanf(fp, "%d%c", &input, &temp) != 2){
        counterInvalid += 1;
        entry += 1;
        printf("%d\t*\t\t%d\tIncorrect Format\n", entry, input);
    }