ページ 11

日付の文字列から数値を抜き出す【C言語】

Posted: 2012年10月01日(月) 09:57
by オカピーα
おはようございます。
たびたび申し訳ありませんが今回もまた質問をさせていただきます。
今回の質問はC言語です。

今、日付の入った文字列を渡して日付を表す数値だけを抜き出すプログラムを作っています。
とりあえず質問用に簡略してみました。

コード:

#include<windows.h>
#include<string.h>
#include<tchar.h>


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
				   LPSTR lpszCmdLine,int nCmdShow)

{
	TCHAR TimeBuf[] = TEXT("2012/05/07 14:19");
	TCHAR MadeBuf[64];
	TCHAR MsgBuf[128];
	int nTime;


	_tcsncpy(MadeBuf,&TimeBuf[4],(size_t)2);
	nTime = _tstoi(MadeBuf);			
	wsprintf(MsgBuf,TEXT("抜き出した時刻:%i"),nTime);
	MessageBox(NULL,MsgBuf,TEXT("C言語TEST"),MB_OK);
    return 1;
}
この場合メッセージボックスに「05」または「5」と表示されれば大成功なのですが
なぜか0の状態です。
一体どうしたら良いのでしょう?
どなたか教えてください。

Re: 日付の文字列から数値を抜き出す【C言語】

Posted: 2012年10月01日(月) 11:00
by バグ
まず、TimeBuf配列に格納されている値を列挙してみます。

TimeBuf[0] = '2'
TimeBuf[1] = '0'
TimeBuf[2] = '1'
TimeBuf[3] = '2'
TimeBuf[4] = '/'
TimeBuf[5] = '0'
TimeBuf[6] = '5'
TimeBuf[7] = '/'
TimeBuf[8] = '0'
TimeBuf[9] = '7'
(以下略)

次に_tcsncpy関数を実行している箇所を見直してみましょう。

_tcsncpy(MadeBuf,&TimeBuf[4],(size_t)2);

TimeBuf[4]から2文字分コピーされています。
では、TimeBuf[4]、TimeBuf[5]にはそれぞれ何が格納されているでしょうか?

TimeBuf[4] = '/'
TimeBuf[5] = '0'

これを文字列から数値に変換した結果は0です。

※ついでに、_tcsncpy関数は終端文字処理をしてくれませんので、バッファ用の配列は終端文字で初期化しておいたほうがいい・・・というか、するべきでしょう。
今のままですと何が格納されているか分かりません。未初期化領域に「たまたま数値に変換できる値が格納されていた」りすると、意図しない値が返ってくる可能性があります。

Re: 日付の文字列から数値を抜き出す【C言語】

Posted: 2012年10月01日(月) 11:16
by オカピーα
な、なるほど!
ポインタの指定が不正だったのですね!
修正してみたらうまくいきました
ありがとうございます!