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

2024-02-06 14:58

本文主要是介绍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'是相等的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/684668

相关文章

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

Oracle中实现在原来自段值得基础上追加字符串

update person t set t.name = t.name || 'and 李思思' where t.id = '2';

八大排序原来也不过如此

详解八大排序 前言1.插入排序1.1 直接插入排序1.2 希尔排序 2.选择排序2.1 选择排序2.2 堆排序 3. 交换排序3.1 冒泡排序3.2 快排3.2.1 hoare版本3.2.2 挖坑版本3.2.3 双指针版本3.2.4 快排优化3.3.5 快排时间复杂度和空间复杂度分析3.2.5 非递归实现快排 4. 归并排序4.1 递归实现4.2 非递归实现 5. 计数排序6. 总结

Oracle之用TO_CHAR函数将日期格式转化为不带前导零的月份和日

要求: 1、日期格式转化成字符串格式,月和日前面的0需要去掉,如日期2024-09-06需要转化成2024-9-6; 2、如果用截取拼接函数写法就会复杂,最好用TO_CHAR函数格式化实现。 正确写法: SELECT TO_CHAR(SYSDATE,'YYYY-fmMM-dd') AS DATE1 , -- 执行结果为 2024-9-6TO_CHAR(SYSDATE,'fmYYYY-MM-d

一道算法题引发的动态内存管理的思考

在做PKU2762时,需要建邻接表。 于是按部就班写了下面一个插入边到邻接表中的函数: const int VMAX = 1010;typedef struct Graph{int vex;Graph* next;}Graph;Graph ArcGraph[VMAX];void insert(int u, int v){Graph* t = new Graph;Graph*

妈耶!被夸爆的毕业设计选题原来在这里《社区老人智慧服务系统的设计与实现。》

🎓亲爱的同学们,你是否正在为计算机毕业设计选题而犯愁?今天,我要给大家推荐一个既实用又有趣的选题!这个项目不仅能让你在毕业设计中脱颖而出,还能让你对旅游行业有更深入的了解。 🚩毕设中如何选题?🍑  对于项目设计中如何选题、让题目的难度在可控范围,以及如何在选题过程以及整个毕设过程中如何与老师沟通,有疑问不清晰的可以联系我,免费提供咨询答疑;【💯提供2000个题库参考💯】 🚭毕设项

引发蛀牙、避免蛀牙食物大全

引发蛀牙、避免蛀牙食物大全 引发蛀牙的食物大全: 糖果 糖浆 糖果棒 巧克力 碳酸饮料 果汁 口香糖 蜂蜜 蛋糕 甜点 薯片 脆饼干 果酱 果冻 蜜饯 蜜饯果干 避免蛀牙的食物大全: 高纤维蔬菜 水果 坚果 种子 高钙乳制品 高蛋白质肉类 高蛋白质鱼类 绿茶 水 蔬菜汤 鸡汤 酸奶 酸奶制品 奶酪 红薯 土豆 面包和全麦面包 芝士

捉虫笔记(四)-- 空格引发的悬案

空格引发的悬案 1、描述现象: 在代码中有一段利用rmdir指令删除目录代码,但是有用户反馈一直删除失败,但是有没有看到错误的日志信息,正好有同事能复现,所以今天好好探究一番。 2、思考过程 很好奇的一点就是为什么有的环境就是正常。 首先想到2个问题: ①代码有没有执行。 ②假如执行,有没有错误。 关于这两个问题都有个难点,我该如何下断点: 2.1、分析代码是否执行 删除目录的

【C语言】---- 基本数据类型(char、int、float)

1 基本数据类型 C语言中的基本数据类型包括整型、浮点型和字符型,每种类型都有不同的存储大小和表示范围。以下是它们的常见表示形式和特点: 1.1 字符型 char类型用于表示单个字符,通常用于表示文本数据。char类型也被用来存储字符,但也可以用来存储较小的整数。在C语言中,char类型的大小一般为1字节(8位)。char类型可以是有符号的或无符号的,这取决于编译器和平台的实现。 1.2

mysql数据库中的字符串长度函数:LENGTH() 与 CHAR_LENGTH()

在数据库管理系统中,处理字符串数据时,了解字符串的长度是一个常见且重要的需求。无论是为了数据验证、格式化输出,还是在进行复杂的查询操作中,准确获取字符串的长度都是必不可少的。SQL标准提供了几种函数来帮助我们实现这一目标,其中LENGTH()和CHAR_LENGTH()是两个常被提及的函数,尽管它们在某些数据库系统中可能表现出相似的行为,但在一些细节上存在差异。本文将深入探讨这两个函数的用法及其区