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

972 篇文章 329 订阅
309 篇文章 11 订阅

        一直以来, 我总是以为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); // 居然是12345789

	int 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); // 12345

	for(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'); // 10
	printf("%d\n", '\034'); // 28

	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值