2016-11-25 31 views
0

Hy我有一个示例代码bleow,它应该以液晶显示器(正在运行的文本)的方式写入“MSG”,并且当它到达结尾时它会再次发生切换,但是当我为“LCD”分配内存(可以是10个字符+终止0)用一堆随机字符填充它。 Sample picture为char分配内存时奇怪的字符*

#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

使用'printf(MSG);'不是一个好主意;你应该使用'printf(“%s”,MSG);'。这里并不重要,因为用户无法控制消息的内容,并且消息中不包含百分号(如果一切正常),但通常用户提供的数据可以打印,所用的内容可能会致命。他们被称为“格式字符串漏洞”。 –

回答

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

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

strcat函数将一个字符串附加到另一个字符串上。两个字符串都必须是合法的,格式良好的字符串,否则您不能致电strcat

这是原因之一,一般建议您使用strncpy - 也不能保证结果是一个有效的字符串,很容易让你做的那种错误。是的,当您通过限制大小调用strncpy时,确保没有溢出缓冲区,但是您没有确保缓冲区包含有效的字符串。

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

+0

从技术上讲,任何缓冲区最终都会以零字节终止,所以任何缓冲区实际上都是一个合法的字符串:) – m0skit0

+1

@ m0skit0:否。如果在分配给缓冲区的空间内没有空字节,则缓冲区不是合法字符串。最终,缓冲区范围之外的某个零字节可能会被视为字符串的终止,但在此之前就会发生“未定义的行为” - 任何事情都可能发生。 –