while(ch=getchar()!=EOF)中的安全问题

版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/lws123253/article/details/79945701

如果有以下这样的代码:

char ch;

...

while((ch=getchar())!=EOF)

{

...

}

你是否考虑过它存在的安全问题?

我们仔细分析下,getchar()返回int值,然后赋值给char 类型的ch变量,会造成截断,然后char 类型又升为整型和EOF比较。这段代码必然会导致一些安全问题。当这段代码运行在无符号字符集的机器上时,如果读取 了一个值为\377的字节时,循环就会被终止。因为这个值被截断再提升之后与EOF相等。当这段代码在使用无符号字符集的机器上运行时,这个循环永远不会停止。

再问 while(ch=getchar()!=EOF)

07-31

这是做一个习题遇见的问题。rnrn比如:rn while(ch=getchar()!=EOF) //errorrn和rn while((ch=getchar())!=EOF) //多了层括号rnrn类似如下代码:rnrn#include rnint main(void)rnrn char ch;rn int a;rn a=0;rnrn while ((ch = getchar())!=EOF) //如果去掉这层括号while (ch = getchar()!=EOF) rn rn if (ch >= ' ' || ch == '\n' || ch == '\t')rn printf("%-5c",ch);rn else printf("^%-4c",ch+64);rn printf("%-5d",ch);rnrn if(a%8 == 0) rn printf("\n");rnrn a++;rn rnreturn 0;rnrnrn这个程序是用来读取字符流并针对不同字符采取不同的处理方式。(最后有题干)rn问题在于如果去掉括号结果会出错。rnrn运行实例:rn--------------rnYES:有括号的情况下rn-----------rnarna 97rnrn 10 请按任意键继续. . .rn-----------rn-----------rnNO:没有括号的情况下rn-----------rnarn^A 1rn^A 1 请按任意键继续. . .rn------------rnrn故障点在于这两条语句:rnwhile ((ch = getchar())!=EOF) rnwhile (ch = getchar()!=EOF) /errorrnrn为什么error语句会导致如上述输出?rnwhile (ch = getchar()!=EOF) //这句表达式如何求值?rn根据优先级:rngetchar()!=EOF先结合,返回一个bool值。//这个推论正确?rn然后再将来这个bool值赋值给ch? ch = (bool)x ? //这个推论正确?rnrn总之:rn我的疑惑点现在集中于:rn抛掉正确与否,为什么这种(错误的)语法会导致这样(错误)的输出结果?rnrnrnrn附上这个程序的题干:rn编写一个程序,把输入作为字符流读取,直到遇到EOF。令该程序打印每个输入字符及其ASCII编码的十进制值。注意在ASCII序列中空格字符前面的字符是非打印字符,要特殊处理这些字符。如果非打印字符是换行符或制表符,则分期打印\n或\t。否则,使用控制字符符号。例如,ASCII的l是Ctrl+A,可以显示为AA。注意A的ASCⅡ值是Ctrl+A的值加64。对其他非打印字符也保持相似的关系。除去每次遇到一个换行符时就开始一个新行之外,每行打印10对值。

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭