在录入程序时有时稍不注意就可能录入错误的字符导致程序运行结果出现错误,下面举例说明。
下面程序的运行结果是错的,但程序又没有错,到底问题出现在哪呢?
#include <stdio.h>
int main()
{
FILE *fp;
int i, k, n;
fp=fopen("data.dat", "w+");
for(i=1; i<6; i++) {
fprintf(fp,"%d ",i);
if(i%3==0) {
fprintf(fp,"\n");
}
}
rewind(fp);
fscanf(fp, "%d%d",&k,&n);
printf("%d %d\n",k,n);
fclose(fp);
return 0;
}
程序运行结果是:
并且在不同的机器上运行的结果可能不同,例如结果可能是:
1 20
1 -858993460
检查程序,也没有看出问题来,打开文件的方式是"w+",这意味着对一个文本文件进行读写,如果打开文件时文件不存在,则创建,否则打开已存在文件,截断所有内容,从头再写,然后可以读。
百思不得其解,后来对fprintf(fp,"%d ",i);进行查看,无意间发现光标在移过空格时和平时的印象不一样,仔细分析,发现了问题,此处的字符“ ”不是空格字符“ ”。那么“ ”到底是什么?我们把它拿出来,编写程序看看它的原形,程序如下:
#include <stdio.h>
#include <string.h>
int main()
{
char str[]={" "};
int len=strlen(str);
printf("len=%d\n",strlen(str));
for(i=0; i<len; i++) {
printf("%2x ",str[i]&0xff );
}
printf("\n");
return 0;
}
运行结果如下图所示。
该字符长度为2,这两个字节值都是0xa1,它中文语境中用它来作为空格的,有的中文输入法,在输入空格时,可能用它代替空格。
问题找到了,用空格' '替换' ',程序运行结果正确,输出结果是:
1 2
在实训中,我们同样遇到一个类似的错误,程序如下:
/* 编写函数:用来判断一个整数是否满足"用3除余1,
用5除余3,用7除余4”,满足则返回1,不满足返回0,
然后编写main函数,输入范围m和n,通过调用该函数
显示出m~n之间满足该条件的数。
*/
#include <stdio.h>
int fun(int s, int t)
{
for(int i=s; i<=t; i++) {
if(i%3==1 && i%5==3 && i%7==4) {
return i;
}
}
return -1;
}
int main()
{
int s,t,num;
scanf("%d,%d",&s,&t);
do {
num = fun(s,t);
if (num>=0){
printf("%d ",num);
}
s=num+1;
}while(num>=0);
return 0;
}
显然,这个结果与我们预想的不一样,为什么?
在第19行要求输入数据时以逗号为分隔符,我们在输入数据时也是用逗号作为分隔符的,为什么错呢?
细心观察输入逗号,发现它非常的圆润,不像西文的逗号,问题是不是它呢?再次运行,结果正确了。
可见,在输入时也需要区分中西文符号的不同。
如何避免这个问题的出现呢?
一种方法就是在scanf中不要使用分隔符,在输入数据时用空白符作为分隔符录入数据,因此,第19行改为scanf("%d%d",&s,&t); 就可以避免这类错误。
第二种方法,在输入时进行判断,如果没有接收到正确的输入,那就再次输入。
第19行的语句用下面的语句块替代:
while (scanf("%d,%d",&s,&t)!=2) {
printf("Input error, try again.\n");
while(getchar()!='\n');
}
参考文献:
[1]李红卫,李秉璋. C程序设计与训练(第四版)[M],大连,大连理工大学出版社,2003.
[2]https://pan.baidu.com/s/17ZXphwqySNIsIgcGtYMjvg?pwd=lhwc