黄楼企业建站流程,极简网站设计,如何给网站做优化代码,世界500强公司排行榜在录入程序时有时稍不注意就可能录入错误的字符导致程序运行结果出现错误#xff0c;下面举例说明。
下面程序的运行结果是错的#xff0c;但程序又没有错#xff0c;到底问题出现在哪呢#xff1f;
#include stdio.h
int main()
{FILE *fp;int i, k, n;fpfopen(…在录入程序时有时稍不注意就可能录入错误的字符导致程序运行结果出现错误下面举例说明。
下面程序的运行结果是错的但程序又没有错到底问题出现在哪呢
#include stdio.h
int main()
{FILE *fp;int i, k, n;fpfopen(data.dat, w);for(i1; i6; i) {fprintf(fp,%d ,i);if(i%30) {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 lenstrlen(str); printf(len%d\n,strlen(str));for(i0; ilen; 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 is; it; i) {if(i%31 i%53 i%74) {return i; } }return -1;
}
int main()
{int s,t,num;scanf(%d,%d,s,t);do {num fun(s,t);if (num0){printf(%d ,num);} snum1;}while(num0); 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?pwdlhwc