我编写了以下示例程序,但它们的输出不是我预期的。
在我的第一个程序中,s
包含一些字符,但其中一个大于 127( 0xe1
(。当我打印s
时,输出不是我预期的。
#include <stdio.h>
int main()
{
int i, len;
unsigned char s[] = {0x74, 0x61, 0x6f, 0x62, 0xe1, 0x6f, 0x63, 0x64, 0x6e};
for (i = 0; i < sizeof(s) / sizeof(unsigned char); i++) {
printf("%c ", s[i]);
}
printf("n%sn", s);
return 0;
}
你猜怎么着?输出是:
t a o b c d n
taobn@
然后我对第一个程序做了一些小的更改,这是我的第二个程序:
#include <stdio.h>
int main()
{
int i, len;
unsigned char s[] = {0x74, 0x61, 0x6f, 0x62, 0xe1, 0x6f, 0x63, 0x64, 0x6e};
// Iteratively output was deleted here
printf("%sn", s);
return 0;
}
输出也让我感到惊讶,它们是:
taobn
为了检查这是否是glibc
的一个奇怪功能,我编写了第三个程序,它绕过glibc
的I/O缓冲区,并通过系统调用直接将s
写入write
文件中。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
int fd;
unsigned char s[] = {0x74, 0x61, 0x6f, 0x62, 0xe1, 0x6f, 0x63, 0x64, 0x6e};
if((fd = open("./a.out", O_WRONLY | O_CREAT)) < 0) {
printf("error openn");
return -1;
}
write(fd, s, sizeof(s));
close(fd);
return 0;
}
输出仍然是:
[cobblau@baba test]$ cat a.out
taobn
谁能解释一下? 这是怎么回事?
谢谢。
使用变量调用printf("n%sn", s)
s
不指向以 null 结尾的字符串会产生未定义的行为。简单来说,数组中的最后一个字符应该是 0(又名