sprintfがstringに遭遇すると
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は数値を変更します.長い間探してやっと原因を発見した.
テストの証拠を残します.
次に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(...)
{
}
}