【问题标题】:How can I prevent next variable of struct being printed?如何防止打印结构的下一个变量?
【发布时间】:2017-10-26 08:32:05
【问题描述】:

这是我的代码:

#include <stdio.h>

struct fruit {

    char one[6];
    char two;

};
typedef struct fruit Fruit;

int main() {

    Fruit *a = (Fruit*) malloc (sizeof(Fruit));
    char* a1 = "apple";
    memcpy(a->one, a1, 6);
    a->two = 'Z';


    Fruit *b = (Fruit*) malloc (sizeof(Fruit));
    char* b1 = "banana";
    memcpy(b->one, b1, 6);
    b->two = 'Z';

    printf("a->one is %s, b->one is %s\n", a->one, b->one);

}

输出是

a->one is apple, b->one is bananaZ

如您所见,当我尝试打印 a->one(苹果)时,一切正常。但是当我尝试打印具有完整尺寸的 b->one 时,它​​会到达下一个变量并打印bananaZ。我怎样才能防止这些事情发生?我想让它在不改变水果结构的情况下打印香蕉。

【问题讨论】:

  • "banana" 不是 6 个字节长,而是 7 个字节。当您仅复制 6 时,您会丢失字符串结尾标记。

标签: c string struct memcpy


【解决方案1】:

改变:

memcpy(b->one, b1, 6);

到:

memcpy(b->one, b1, 7);

根据您之前的@​​987654323@,复制字符串apple。在这种情况下,您的字符串中有 5 个字母,但您传递给memcpy 的长度是6,以便包含终止字符\0。同样的逻辑,banana 有 6 个字母,因此为了包含终止字符 \0,传递给 memcpy 的长度必须是 7

想让它在不改变水果结构的情况下打印香蕉。

但这不是一个正确的政策。如果要保留长度为 6+ 的单词,则必须更改结构。你写的字不能超过one的大小。

【讨论】:

    【解决方案2】:

    你只需要修改

    struct fruit {
    
        char one[6]; //<== put a 7 instead of 6
        char two;
    
    };
    

    字符串的结尾是"\0"
    如果您设置一个大小为 6 的字符串并且您的单词是“banana”(也是 6),那么您就没有"\0" 的位置,而您开始阅读你不想要的东西。

    【讨论】:

      【解决方案3】:

      C 中,字符串以空结尾,字符串的最后一个字节必须是 ascii 值 0 => '\0'。

      所以如果要在缓冲区中复制一个 6 字节的字符串,则必须允许 7 个字节,最后一个设置为 0。

      【讨论】:

        猜你喜欢
        • 2017-06-19
        • 2012-04-10
        • 1970-01-01
        • 2014-12-09
        • 1970-01-01
        • 2014-08-22
        • 1970-01-01
        • 1970-01-01
        • 2013-05-09
        相关资源
        最近更新 更多