2016-11-25 65 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:否。如果在分配給緩衝區的空間內沒有空字節,則緩衝區不是合法字符串。最終,緩衝區範圍之外的某個零字節可能會被視爲字符串的終止,但在此之前就會發生「未定義的行爲」 - 任何事情都可能發生。 –