字符串最后打印出一些乱码,我必须在C中错误地创建一个字符串

时间:2016-04-28 08:41:00

标签: c

我不确定我做错了什么,但我很确定我正在访问内存我不应该考虑打印语句最后是打印乱码。

继承我创建args结构的地方。

char pureMessage[80];
FILE *file = popen("fortune","r");
if(fread(pureMessage, 80, 1, file) == 0) {
    if(feof(file) == 0) {
        perror("errorfread");
    }
}
strcpy(args->message, pureMessage);
put(args,clnt);

以下是我如何将其打印到控制台:printf("Client PUT: %s\n", args->message);

Heres args struct

struct rpc_args {
    char action[20];
    char id[80];
    char message[80];
};

program DATABASE {
    version ASSIGNMENT_7 {
        rpc_args ACTION(struct rpc_args) = 1;
    } = 1;
} = 0x20fff100;

1 个答案:

答案 0 :(得分:0)

如果您从中复制的内存缓冲区(在本例中是文件中的字节序列)不是以空值终止的,则

strcpy()是不安全的。最后需要另一个字符作为空字符,所以

  • 您只能使用fread()
  • 读取79个字符
  • 或者在您写入char message[80]的结构中创建char message[81] - 然后它在末尾有额外的空字符空间
  • 如果您不希望结构中的消息以空值终止,则使用strncpy()memcpy()代替strcpy()

在前两种情况下,您可以再次使用多个选项来确保结尾处的空字符

  • pureMessage[79] = '\0'行之后插入char pureMessage[80];(如果你想让缓冲区为1,则为80和81) char更长)
  • 使用strcat()代替strcpy(),并在pureMessage[0] = '\0'来电之前插入strcat()