【问题标题】:adding a character into string and printing it prints gibberish in C在字符串中添加一个字符并打印它会在 C 中打印乱码
【发布时间】:2014-01-03 20:30:38
【问题描述】:

所以我有这个功能:

void function (linked_list first, char character){
    linked_list new = NULL;
    new = (linked_list) malloc(sizeof(linked_list));
    new->name[0] = character;
    puts (new->character);
    ...

我的问题是,这将打印出我的角色,然后是一些垃圾,例如如果character = t,puts 将打印 tőú 或类似的东西。

所以我的问题是,如何将 char 放在字符串的末尾,而不会弄乱一切?哦,名称在结构内部定义为 char name[256];

【问题讨论】:

  • 我们不知道您的linked_list 结构(更正,linked_list 指向的任何结构)是什么样的;特别是,我们不知道new->character 是什么。或者你真的打电话给puts(new->name)?如果是这样更新您的问题,以便向我们展示您的实际代码(复制并粘贴它)。

标签: c string char character puts


【解决方案1】:

C 中的字符串需要终止。所以你想做

new->name[0] = character;
new->name[1] = '\0';

否则,您将看到内存中的所有“乱码”(malloc 不会清除内存,因此它指向“那里的任何内容”)。

@self 提出的观点也不是很好——你没有为结构分配足够的内存,而只是为结构的指针分配了足够的内存。在现代 C 中(实际上是 C89 之后的任何内容),您不会强制转换 malloc 的结果 - 那是“旧的 K&R”(我知道,因为这是我学到的……)。这些天你应该写

new = malloc(sizeof(*new));

通过使用sizeof(*new),您可以保证大小是正确的,即使您将来改变对new 的类型的想法……这是最干净的方式(也是对@的点头) WhozCraig 在评论中指出了这一点)。

【讨论】:

    【解决方案2】:

    puts 期望字符串以空值结尾。

    如果您只是将一个字符复制到字符串中,请添加一个空终止符:

    new->name[0] = character;
    new->name[1] = '\0';
    puts (new->name);
    

    【讨论】:

    • 正如 Keith Thompson 所说,我假设您的意思是 puts (new->name),而不是 puts(new->character)
    【解决方案3】:

    假设linked_list 是一个类型定义的指针(它必须是因为你用它转换了你的malloc),那么你的malloc 只为指针分配了足够的空间。您应该为整个结构分配空间。

    new = (linked_list) malloc(sizeof(*linked_list));
    

    【讨论】:

    • 好收获!令人惊讶的是,一个人可以在三行代码中犯多少错误。
    • 如果你把那个演员扔掉会更好。如果你使用sizeof(*new),那就更好了。
    • @WhozCraig 我保留了原来的风格。
    • 是的 - 大约 15 年前,原始风格已经过时了。我知道,因为我的原始 K&R 仍然具有该语法...
    • @Floris 我应该使用新旧方式并比较+解释,但没有因为太懒。
    猜你喜欢
    • 2020-07-27
    • 2020-12-24
    • 2020-06-24
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多