c - 用八进制常量初始化字符数组
问题描述
我看到一条评论说初始化 char 数组"\001"
会将 nul 作为第一个字符。我已经看到在哪里\0
设置了一个 nul。
未经编辑的评论:
字符输入[大小] = ""; 是足够的初始化。如果你已经初始化了 input[SIZE] = "\001"; while ( '\001' == input[0]) 不会做你认为它正在做的事情;(它创建一个空字符串,其中 nul 字符作为第一个字符。)
这个节目
#include <stdio.h>
#define SIZE 8
int main ( void) {
char input[SIZE] = "\001";
if ( '\001' == input[0]) {//also tried 1 == input[0]
printf ( "octal 1\n\n");
}
else {
printf ( "empty string\n");
}
return 0;
}
在 Linux 上运行,用 编译gcc
,输出:
octal 1
所以第一个字符是1
而不是'\0'
。
这是标准行为还是只是 Linux 的行为gcc
?为什么不设置nul?
解决方案
这是标准行为还是只是 Linux 和 gcc 的行为?为什么不设置nul?
您提供的代码的行为符合标准的要求。在字符串文字和整数字符常量中,八进制转义可能包含一位、两位或三位数字,并且 C 标准指定
每个八进制 [...] 转义序列是可以构成转义序列的最长字符序列。
( C2011, 6.4.4.4/7 )
在这种情况下,另外相关的\0
是八进制转义序列,而不是空字符的特殊独立代码。上述引文的更广泛背景将说明这一点。
在字符串 literal"\001"
中,反斜杠后跟三个八进制数字,八进制转义可以有三个数字,因此转义序列由反斜杠和所有三个数字组成。结果字符串的第一个字符是整数值 1 的字符。
如果出于某种原因您想要一个由空字符后跟十进制数字 0 和 1 组成的字符串文字,那么您可以使用完整的三位转义来表示空字符,
"\00001"
或像这样拆分它:
"\0" "01"
C 将连接相邻的字符串文字以产生所需的结果。
推荐阅读
- java - 从 MySQL 检索到的 TemporalType.TIMESTAMP 错误
- dax - 创建一个 Dax 度量以获取平均值
- html - 如何为同一个 HTML 文件中的两个按钮创建两个单独的 POST 方法?
- python - 如何在用户输入中识别名称(来自文本文件)然后打印名称 pt.2
- python-3.x - 如何从用户填写的表单中提取手写文本(图像)
- unity3d - tilemap 中的通用渲染管道 2d 阴影
- python - 更改字典中特定键的特定值
- java - 无法从前置扬声器切换到后置扬声器
- regex - 如何使用正则表达式提取器提取文本值
- java - 方法重载——方法的调用是否依赖于类中方法定义的出现