在字符串中添加一个字符并打印它会在C中打印出乱码

时间:2014-01-03 20:30:39

标签: c string char character puts

所以我有这个功能:

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,则会打印tőú或类似的东西。

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

3 个答案:

答案 0 :(得分:2)

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

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

否则你会看到内存中的所有“乱码”(malloc没有清除内存,所以它指的是“那里有什么”)。

不是@self所提出的优点 - 你没有为结构分配足够的内存,而只是指向结构的指针。在现代C(C89之后的任何东西,真的)你没有投出malloc的结果 - 那是“老K& R”(我知道,因为这是我学到的......)。这些天你应该写

new = malloc(sizeof(*new));

使用sizeof(*new)即使您将来改变对new类型的看法,也可以保证大小合适...这是最干净的方法(和向@WhozCraig致敬,他在评论中指出了这一点。

答案 1 :(得分:1)

puts期望字符串以空值终止。

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

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

答案 2 :(得分:1)

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

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