本文主要是介绍char str1[11] = 12345\06789; 引发的深刻教训---原来'\067'与'7'是相等的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一直以来, 我总是以为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;
}
这篇关于char str1[11] = 12345\06789; 引发的深刻教训---原来'\067'与'7'是相等的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!