sprintfがstringに遭遇すると

1633 ワード

sprintfがstringパラメータを使用する場合に必ず使用することはよく知られている.c_str()をchar*に変換しないと「(NULL)」が表示されます.一度油断してsprintfで「(NULL)」を発見しましたが、このパラメータはchar*で、どうしてもchar*が「(NULL)」になった原因が見つかりません.その後、sprintfのパラメータを詳しくチェックするたびに、このchar*の前のパラメータがstringであることがわかり、char*に回転するのを忘れてしまい、それ自体が「(NULL)」になっておらず、後のパラメータが「(NULL)」になった.
次にchar[]グローバル変数を定義する場合は、必ず初期化しなければなりません.そうしないと、使用時に奇妙な問題が発生します.
ある時、グローバル変数int gPCIDを定義した.char gKey[32];
テキストプロファイルを読み込む場合は、gPCID、gKeyに行ごとに読み込んで割り当てます.gPCID読み出し時は正常で、gKey読み出し後、gPCIDは数値を変更します.長い間探してやっと原因を発見した.
テストの証拠を残します.
#include 
#pragma hdrstop

#include "Unit1.h"

#include 
#include 
#include 
using namespace std;
int  gPCID;
char gKey[32];//       ={0}
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
#define DIR "D:\\Program Files\\NoDel.dat"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    try
    {
        char line[64] = {0};     //     
        std::ifstream openfile(DIR, std::ios::in);
        openfile.getline(line, sizeof(line));
        gPCID = atoi(line);

        openfile.getline(line, sizeof(line));
        //string s= line;//         gPCID ,        
        strcpy(gKey, line);
        openfile.close();
    }
    catch(...)
    {

    }

}