提问人:Carson Coder 提问时间:3/1/2023 最后编辑:Carson Coder 更新时间:3/1/2023 访问量:72
printf in C 打印额外的字符
printf in c printing extra charactors
问:
我是堆栈溢出和 c 的新手。告诉我是否需要添加更多详细信息
我正在尝试制作一个刽子手游戏,当我尝试打印板时,除了在板上打印单词(应该是免费的单词)之外,一切都有效。例如,它给出了免费这个词。不应该有任何额外的字母。我尝试打印出字符串本身,而不是在函数中,如果它可以正常工作,但它在函数中不起作用。draw_board()
_ _ _ _
_ _ _ _ jdgx
draw_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 行。
答:
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 好吧,但这不是很重要。主要问题是访问分配的阵列之外的内存。
评论
"I have tried printing out the string itself out of draw_board() and it works fine online in draw_board() does it not work."
main
#include
LetterString