sof*_*bul 16 c printf format-specifiers nul
printf当我使用ASCII表中的NULL字符时,为什么要打印空格而不是停止?这就是我的意思:
printf("Hello%c, world", 0); //Hello , world
printf("Hello%c, world", '\0'); //Hello , world
Run Code Online (Sandbox Code Playgroud)
只有当我将转义字符放在字符串本身时printf才会停止字符串:
printf("Hello\0, world"); //Hello
Run Code Online (Sandbox Code Playgroud)
我在Windows 8,Windows 10(使用cygwin,MinGW,Netbeans,Code :: Blocks),XUbuntu上试过这个,它都是一样的.
问题出在哪儿?我问过我的一个朋友,但他说他没有这样的问题,所有三个例子都以同样的方式执行.
Jea*_*nès 22
printf("Hello\0, world");将其参数用作C字符串,因此它会对其进行解码,直到找到NUL字符,因此它会在之后停止\0,忽略后面的内容.
printf("Hello%c, world", 0);解码它的参数(直到它在里面找到一个NUL字符 - 即之后d),同时它找到一个%c,所以它用作为参数给出的字符(其ASCII码为NUL)替换它,然后向终端发送一个NUL字符,然后继续.
Printf手册说:
这些函数在格式字符串的控制下写入输出,该格式字符串指定后续参数如何转换为输出.
您依赖于printf()实现细节.低级终端输出函数需要字符串的长度作为参数.printf()有两种方法可以做到这一点.
有点明显的方法是首先格式化字符串,然后使用strlen().那是你希望的那个.
但这样效率很低,因为它需要在字符串缓冲区中进行双重传递并附加0.另一种方法是在替换字段时跟踪格式化的字符串长度,只需为每个附加字符递增它.由于它继续超过%c,因此您现在将获得更大的长度,包括过去%c的所有内容.终端函数对嵌入式0的作用也是一个实现细节,因为它不是可打印的字符.看到它被空间取代并不罕见.
姗姗来迟的方法是不依赖于实施细节.
| 归档时间: |
|
| 查看次数: |
2777 次 |
| 最近记录: |