我对此很新。我正在尝试重新编写此代码,以便删除在第12 + 19行中拾取的缓冲区溢出。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE (1024)
int main(int argc, char* argv[]) {
char* inBuf;
char* outBuf;
char* fmt = "the winner is: %s";
inBuf = (char*) malloc(BUF_SIZE);
if (inBuf == NULL) {
return -1;
}
read(0, inBuf, BUF_SIZE);
outBuf = (char*) malloc(BUF_SIZE);
if (outBuf == NULL) {
return -1;
}
sprintf(outBuf, fmt, inBuf);
fprintf(stdout, "%s\n", outBuf);
fprintf(stderr, "%s\n", outBuf);
free(inBuf);
free(outBuf);
}
如果有人能提供一些有关最佳方法的见解吗?非常感谢谢谢。
答案 0 :(得分:0)
因为您使用read
函数来读取用户输入,所以您正在读取原始字节而不是字符串。因此它所读取的内容并不包含空终止字节,因此您不会有空终止字符串,因为malloc
返回的缓冲区未初始化。
使用calloc
代替malloc
,它会返回初始化为全零的缓冲区。
inBuf = calloc(BUF_SIZE + 1, 1);
请注意,这会为终止空字符留下额外的字节。
您还应该检查read
的返回值是否有错误,并且您不应该转换malloc
/ calloc
/ realloc
的返回值
您的输出缓冲区大小也太小。它应该至少是输入字符串的大小加上格式字符串。
outBuf = (char*) malloc(BUF_SIZE + 1 + strlen(fmt));