为什么使用 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 值。
我有一个大概的理解问题!这是我的代码:
#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 值。