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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
オカピーα
記事: 120
登録日時: 13年前

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

#1

投稿記事 by オカピーα » 13年前

おはようございます。
たびたび申し訳ありませんが今回もまた質問をさせていただきます。
今回の質問は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の状態です。
一体どうしたら良いのでしょう?
どなたか教えてください。
C,C++,C#,これらを極めることを「3C政策」と言う

アバター
バグ
記事: 130
登録日時: 15年前
住所: 愛媛県
連絡を取る:

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

#2

投稿記事 by バグ » 13年前

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

オカピーα
記事: 120
登録日時: 13年前

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

#3

投稿記事 by オカピーα » 13年前

な、なるほど!
ポインタの指定が不正だったのですね!
修正してみたらうまくいきました
ありがとうございます!
C,C++,C#,これらを極めることを「3C政策」と言う

閉鎖

“C言語何でも質問掲示板” へ戻る