char str1[11] = "12345\06789"; 引发的深刻教训---原来'\067'与'7'是相等的

来源:互联网 发布:只有我知bilibili电影 编辑:程序博客网 时间:2024/05/16 11:17

        一直以来, 我总是以为char str1[11] = "12345\06789";和char str2[11] = {'1', '2', '3', '4', '5', '\0', '6', '7', '8', '9', '\0'};是完全等价的。直到今天调试一个程序, 我才发现, 他们原来是不等价的, 我被这个问题蒙在鼓里, 看来有必要深入看看。

        我一直苦苦思索原来程序产生的异常, 一直找不到原因, 我想, 如果实在是异常, 那就是str1和str2不等价, 而自以为深厚的C语言功底告诉我: str1和str2是绝对等价的。不过, 最后种种迹象都表明,str1和str2不等价。 于是, 我不得不怀疑str1和str2的等价性, 且看程序:

#include <stdio.h>int main(){char str1[11] = "12345\06789";printf("%s\n", str1); // 居然是12345789int i = 0;for(i = 0; i < 11; i++){printf("%d\n", str1[i] - '0');}char str2[11] = {'1', '2', '3', '4', '5', '\0', '6', '7', '8', '9', '\0'};printf("%s\n", str2); // 12345for(i = 0; i < 11; i++){printf("%d\n", str2[i] - '0');}return 0;}
      原来, str1和str2确实不等价。 为什么呢?  查资料才知道‘\067’是一个字符尴尬, 它的ascii值是8进制的67, 也就是55. 而55对应的就是字符'7', 原来'\067'是'7'才是相等的啊, 难怪有上面程序的结果尴尬.

       好了, 终于找到了问题的本质原因了。 看来, 程序猿不能盲目自信啊, 大胆假设, 小心求证。 敢于怀疑看似正常的东西。 最后以一个小程序结尾本文:

#include <stdio.h>int main(){if('\067' == '7'){printf("yes\n"); // yes}else{printf("no\n");}printf("%d\n", '\012'); // 10printf("%d\n", '\034'); // 28return 0;}

0 0
原创粉丝点击