printf in C 打印额外的字符

printf in c printing extra charactors

提问人:Carson Coder 提问时间:3/1/2023 最后编辑:Carson Coder 更新时间:3/1/2023 访问量:72

问:

我是堆栈溢出和 c 的新手。告诉我是否需要添加更多详细信息

我正在尝试制作一个刽子手游戏,当我尝试打印板时,除了在板上打印单词(应该是免费的单词)之外,一切都有效。例如,它给出了免费这个词。不应该有任何额外的字母。我尝试打印出字符串本身,而不是在函数中,如果它可以正常工作,但它在函数中不起作用。draw_board()_ _ _ __ _ _ _ jdgxdraw_board()draw_board()

生成字符串的代码

    const int Size = strlen(Word);

    printf("Your Word is: %s. With a len of %d.", Word, Size);

    char *Word_Letters = malloc(Size);

    for (int i = 0; i < Size; i++)
    {
        *(Word_Letters + i) = '_';
    }
    *(Word_Letters+Size) = '\0';

代码到打印板

printf(" _____\n |   o\n |  %c|%c\n |  %c %c\n_|_\n\n%s\n\nEnter Guess: \0", LA, RA, LL, RL, LetterString);

我得到的输出是

Your Word is: bead. With a len of 4. 

_ _ _ _ AvSV

Enter Guess:

这是整个程序的粘贴 https://pastebin.com/FC2LQZcm

编辑: 我在第 85 行进行了更改,但它不起作用malloc(Size)malloc(Size+1)

第二次编辑: 问题是打印的字符串以不同的方式制作,并且不是以 null 结尾的。感谢@paddy指出问题。 改变

23  char LetterString[LetterSize*2]; ->  char LetterString[LetterSize*2+1];

添加

LetterString[LetterSize*2] = '\0';

在第 35 行。

c for-loop printf malloc 动态内存分配

评论

0赞 Andreas Wenzel 3/1/2023
以下句子不清楚:请具体说明哪些有效,哪些无效。此外,简单地说某些东西不起作用并不足以描述问题。请具体说明它以何种方式不起作用。例如,如果输出不是您想要的,请指定所需的输出以及实际输出。"I have tried printing out the string itself out of draw_board() and it works fine online in draw_board() does it not work."
0赞 Andreas Wenzel 3/1/2023
寻求调试帮助的问题通常应提供问题的最小可重现示例,其中包括函数和所有指令。这允许其他人通过简单地使用复制和粘贴轻松测试您的程序。main#include
0赞 Carson Coder 3/1/2023
我添加更多信息
0赞 paddy 3/1/2023
您有同样的问题,它不是以 null 结尾的。LetterString
0赞 Carson Coder 3/1/2023
@paddy这就是问题所在。如果您发布答案,我会检查它是否正确。

答:

2赞 Vlad from Moscow 3/1/2023 #1

您为包含元素的数组分配了内存Size

char *Word_Letters = malloc(Size);

索引的有效范围为 。[0, Size)

所以这些陈述

*(Word_Letters+Size) = '\0';
*(Word_Letters+Size+1) = 'N';`

调用未定义的行为,因为有人尝试在分配的内存之外写入。

注意:这些陈述

*(Word_Letters+Size) = '\0';
*(Word_Letters+Size+1) = 'N';`

等同于

Word_Letters[Size] = '\0';
Word_Letters[Size+1] = 'N';`

您应该分配内存 .like

char *Word_Letters = malloc(Size + 2);

另一方面,似乎这种说法

*(Word_Letters+Size+1) = 'N';`

没有意义,因为它在存储的字符串末尾之后设置了数组的元素,因为前面的语句

*(Word_Letters+Size) = '\0';

也许其实你的意思是

*(Word_Letters+Size) = 'N';`
*(Word_Letters+Size + 1) = '\0';

评论

0赞 Carson Coder 3/1/2023
我不小心把 N char 的东西留在那里,我用它来开发
0赞 Carson Coder 3/1/2023
我从帖子中删除了该代码以消除混淆
0赞 Vlad from Moscow 3/1/2023
@CarsonCoder 好吧,但这不是很重要。主要问题是访问分配的阵列之外的内存。