2016-11-25 8 views
0

Hy私はLCDディスプレイ(実行中のテキスト)のように "MSG"を書き込む必要がありますサンプルコードbleowを持って、それは再びstrartsしかし、私は"LCD"(これは10文字+終端0)のメモリを割り当て、ランダムな文字の束で埋めます。 Sample picturechar *のメモリを割り当てるときに奇妙な文字*

#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機能が適合しない場合、機能は終了しません。この場合、適合しません。したがって、終了はありません。 0バイトで終わらないものは、ではないの正規の文字列なので、最初のパラメータとしてポインタをstrcatに渡すことはできません。

strcat関数は、1つの文字列を別の文字列に追加します。どちらの文字列も合法的で整形式の文字列でなければなりません。また、strcatを呼び出さないでください。

これは、一般的にあなたない使用strncpyがあることが示唆された理由の一つである - 結果は有効な文字列である保証はありません、それはあなたが作った間違いの種類を作るのは簡単です。はい、サイズを制限してstrncpyを呼び出したときにバッファがオーバーフローしていないことを確認しましたが、バッファに有効な文字列が含まれていることを確認していませんでした。

strcatの代わりにLCD[LCDSize]='\0';が必要でした。これにより、バッファが確実に終了します。

+0

技術的に言えば、どんなバッファも最終的にゼロバイトで終了します。したがって、実際にはすべてのバッファは正当な文字列です:) – m0skit0

+1

@ m0skit0:いいえバッファが割り当てられたスペース内にヌルバイトがない場合、バッファは法的な文字列。最終的には、おそらく文字列の終了として扱われるバッファの範囲外の0バイトになりますが、それ以前には未定義のビヘイビアが発生しています。 –

関連する問題