【发布时间】:2021-12-06 19:46:48
【问题描述】:
我有一个一般性的理解问题!这是我的代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <cstring>
int main() {
// read user input
char input[64] = {0};
read(0, input, 64);
printf("You've entered ");
printf(input);
char newbuf[128];
char smallbuf[8];
// copy into smallbuf 8 bytes of input
memcpy(smallbuf, input, 8);
// send smallbuf of 8 bytes as string into newbuf
sprintf(newbuf, "%s", smallbuf);
// print newbuf
printf(&newbuf[0]);
return 0;
}
我得到 7 个字符的行为还可以,它确实打印了 7 个字符:
$ gcc a.cpp -o a.out && ./a.out
1234567
You've entered 1234567
1234567
1234567
但是使用 8 个字符,它会打印出更多的字符,我想知道为什么会这样:
$ gcc a.cpp -o a.out && ./a.out
12345678
You've entered 12345678
1234567812345678
谢谢你解释我! :)
【问题讨论】:
-
字符串有 null 来标记结束。如果您不复制 null,则字符串不会终止
-
@stark 这是否意味着如果我们写入 n-1 个字符作为输入,那么当我们点击输入终止时,null 字符被复制,但是当我们准确写入 n 个字符时,其中 n 是字节的大小复制然后我们省略终止空字符,因为我们用输入的最后一个字符覆盖它?
-
调用
read时没有终止空字符。你已经通过用全 0 初始化你的input数组来绕过这个问题,但是当你写信给smallbuf和newbuf时,问题就出现了。 -
另外,请不要写
printf(&newbuf[0])之类的东西。如果用户碰巧键入了一个包含一个或两个%符号的字符串,就会发生疯狂的事情!始终使用printf("%s", &newbuf[0])或puts(&newbuf[0])打印字符串。 (在这种情况下,您可以使用printf("%s", newbuf)或puts(newbuf)。) -
memcpy 不知道字符串。看看 string.h 函数。