为什么使用 memcpy 和 sprintf 复制特定的缓冲区大小,在新缓冲区中打印的字符比原始缓冲区中的字符多?

Why does copying a specific buffer size with memcpy and sprintf, prints more chars in new buffer than there are in the original buffer?

我有一个大概的理解问题!这是我的代码:

#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

谢谢你给我解释! :)

代码正在尝试将字符数组打印为 字符串,从而导致 未定义的行为 smallbuf[] 肯定不包含 空字符 ,因此它不是 字符串 .
"%s" 需要一个指向 字符串 .

的匹配指针

要么考虑一个空字符

char smallbuf[8+1];
memcpy(smallbuf, input, 8);
smallbuf[8] = '[=10=]';
printf("%s", smallbuf);

或用精度限制输出。打印字符数组最多 N 个字符或 空字符 .

char smallbuf[8];
memcpy(smallbuf, input, 8);
printf("%.8s", smallbuf);

类似问题适用于 printf(input);


不要编码 printf(input);,因为当 input[] 包含 %.

时,这可能会导致 未定义的行为
// printf(input);
printf("%s", input);

更好的代码会检查 read(0, input, 64) 的 return 值。