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