Hy我有一个示例代码,它应该写出" MSG"在某种程度上,液晶显示器会(运行文本),当它到达终点时,它会再次发生故障,但是当我为液晶显示器分配内存时(其中应该是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;
}
可能是什么问题?
答案 0 :(得分:3)
strncpy(LCD, tmpMSG, LCDSize);
strcat(LCD,"\0");
如果strncpy
函数不适合,它将不会终止。在这种情况下,它不适合。所以没有终止。没有以零字节终止的东西是不一个合法的字符串,所以你不能将指针作为strcat
的第一个参数传递给它,但你确实如此。
strcat
函数将一个字符串附加到另一个字符串。这两个字符串必须是合法的,格式正确的字符串,否则您不能调用strcat
。
这是一般建议您不使用strncpy
的原因之一 - 无法保证结果是有效的字符串,并且很容易犯这种错误你做了是的,当您通过限制大小调用strncpy
时,确保没有溢出缓冲区,但是您没有确保缓冲区包含有效字符串。
您可能想要的是LCD[LCDSize]='\0';
,而不是strcat
的号召。这可以确保缓冲区终止。