TLDR:比如

char x[] = "some output \06 MORE OUTPUT";
puts(x);

给出意想不到的结果.

所以我有这个代码:

#include <stdio.h>

int main(void)
{
    char x[] = "some output \0 MORE OUTPUT";
    puts(x);

    return 0;
}

它会打印:"一些输出",这是预期的,因为\0意味着字符串的结束.但如果我在\0后面添加一个数字,结果就会发生变化.所以代码

#include <stdio.h>

int main(void)
{
    char x[] = "some output \06 MORE OUTPUT";
    puts(x);

    return 0;
}

打印:一些输出更多输出

因此,出于某种原因,如果我在\0之后添加一个数字,那么\0就不再被识别为字符串的结束,而是打印这个RST符号.

如果我只是用\6替换\0,结果是一样的.如果我用其他一些数字来做,结果是一样的,只是符号不同.

为什么呢?这\6件事是什么?我在网上找不到任何关于它的信息.它是如何工作的?

推荐答案

\0实际上除了零字符之外没有特殊含义.按照惯例,我们使用该形式编写空终止符,因为它使语法类似于\n等其他换码序列.

\ <digits>实际上就是所谓的octal escape sequence.任何以\开头的字符都将插入与八进制数对应的字符串中.06是ACK或其他类似的字符,以ASCI形式表示,是一种不可打印的字符.\101将打印'A',以此类推.

在C中,换码序列结束的位置并没有真正定义得很好,编译器可以继续读取\后面的任何数字,只要它们可以用于形成有效字符.或者直到它发现另一个换码序列或字符串字面量的结尾.对于八进制换码序列,最多允许3位数字(但也有十六进制换码序列\x,它没有数字上限).

因此,例如,\08将导致空终止符,因为数字8不能是八进制数的一部分.\101666将打印A666,因为允许的有效八进制数字不超过3个.

要在空终止符或其他八进制换码序列后面插入字符'6',最简单的方法就是结束字符串字面量:

char x[] = "some output \0" "6 MORE OUTPUT"; // string literals will get concatenated into one
puts(x);
char* secret_message = x + 13;
puts(secret_message);

输出:

some output 
6 MORE OUTPUT

C++相关问答推荐

如何避免使用相对路径包含在c中

%p与char* 等组合缺少的GCC Wform警告

如何将FileFilter添加到FileDialog GTK 4

为什么PLT表中没有push指令?

是否有任何情况(特定类型/值),类型双关在所有符合标准的C实现中产生相同的行为?

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

当main函数调用被重构时,C函数给出错误的结果

在C中使用动态内存分配找到最小的负数

当多个线程在C中写入相同的文件描述符时,如何防止争用情况?

如何在C语言中正确打印图形

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

在C中访问数组中的特定值

如何在C++中安全地进行浮点运算

MacOS下C++的无阻塞键盘阅读

如何使用FSeek和文件流指针在C中查找文件的前一个元素和前一个减go 一个元素

OSDev--双缓冲重启系统

c程序,让用户输入两类数字,并给出输出用户输入多少个数字

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

x86-64平台上的int_fast8_t大小与int_fast16_t大小

我该如何处理这个 C 90 代码中的内存泄漏?