gpt4 book ai didi

c - 为 char* 分配内存时出现奇怪的字符

转载 作者:太空宇宙 更新时间:2023-11-04 06:58:58 26 4
gpt4 key购买 nike

Hy 我有一个示例代码 bleow,它应该以 LCD 显示器(运行文本)的方式写入“MSG”,当它到达末尾时它再次启动,但是当我为“LCD”分配内存时(应该是 10 个字符+终止符 0) 用一堆随机字符填充它。 Sample picture

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>



void delay(unsigned int mseconds)
{
clock_t goal = mseconds + clock();
while (goal > clock());
}

int main()
{

int LCDSize = 10;
int MSGSize;
char* LCD = (char *)malloc(LCDSize+1);
char* MSG = (char *)malloc(80);
MSG = "This is a long message, probabli will move.";
MSGSize = strlen(MSG);
if (MSGSize <= LCDSize)
{
printf(MSG);
}
else
{
char* tmpMSG;
int j = 0;
while (j < 2)
{
for (int i = 0; i < MSGSize - LCDSize + 1; i++)
{
tmpMSG = MSG+i;
strncpy(LCD, tmpMSG, LCDSize);
strcat(LCD,"\0");
printf(LCD);
delay(200);
system("cls");

}
printf("----------");
j++;
}
}

getchar();
return 0;
}

可能是什么问题?

最佳答案

            strncpy(LCD, tmpMSG, LCDSize);
strcat(LCD,"\0");

strncpy 函数如果不适合则不会终止。在这种情况下,它不适合。所以没有终止。未以零字节结尾的内容不是合法字符串,因此您不能将指向它的指针作为第一个参数传递给 strcat,但您可以。

strcat 函数将一个字符串附加到另一个字符串上。两个字符串都必须是合法的、格式正确的字符串,否则您不得调用 strcat

这是通常建议您使用 strncpy 的原因之一——不能保证结果是有效的字符串,而且很容易使你犯的错误。是的,您通过限制大小确保在调用 strncpy 时不会溢出缓冲区,但您没有确保缓冲区包含有效字符串。

您可能想要的是 LCD[LCDSize]='\0'; 而不是调用 strcat。这确保缓冲区终止。

关于c - 为 char* 分配内存时出现奇怪的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40810695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com