• ベストアンサー

wsprintfの書式制御文字列について教えてください

変数をLONGLONGで宣言してる場合 printfの場合 printf("%lld時間%02lld分%02lld秒\n",h,m,s); だと 289時間00分55秒 でちゃんと表示できますが wsprintf(szWork,TEXT("%lld時間%02lld分%02lld秒"),h,m,s); だと ld時間ld分ld秒 になります。 一体どうしたらいいのでしょうか? よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

wsprintfはwindows.hに定義された関数で、printfやsprintfのCRT(C ランタイム ライブラリ)の関数に比べると機能的に劣ります。 64ビットの変数を扱う書式は用意されていないので、適切にキャストするか、 もしくはtchar.hに宣言がある_stprintf(または_stprintf_s)関数を使ってください。(printfの書式文字列のままいける) wsprintf http://msdn.microsoft.com/ja-jp/library/cc364872.aspx sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l http://msdn.microsoft.com/ja-jp/library/ce3zzk1k(VS.80).aspx

googleoooo
質問者

お礼

回答ありがとうございます。 _stprintfを使用して解決しました。

その他の回答 (1)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドアイス >ld時間ld分ld秒 >になります。  ↑  これは『%lld』の書式制御文字をサポートしていないからです。  MSDN(日本語版)を調べてみましたが公式には書かれていないですが  『%I64d』や『%I64u』でちゃんと変換してくれます。 サンプル: TCHAR szBuff[ 256 ]; LONGLONG i64 = 1; for ( INT i = 0 ; i < 64 ; i++ ){  wsprintf( szBuff, "%I64u", i64 );  printf( "%02d: %s\n", i, szBuff );  i64 = i64 + i64 + 1; } 実行結果: 00: 1 01: 3 02: 7 03: 15 : 31: 4294967295 32: 8589934591 : 62: 9223372036854775807 63: 18446744073709551615 とちゃんと変換されます。

参考URL:
http://msdn.microsoft.com/ja-jp/library/cc364872.aspx
googleoooo
質問者

お礼

回答ありがとうございます %I64dは使用できるのですね。 参考になりました

関連するQ&A

  • 値を変数に代入してprintfで表示しようとしてもうまくいきません

    値を変数に代入して、printfで表示しようとしてもうまくいきません。 ソースのどこが悪いか教えていただけないでしょうか? 変数の値を1個ずつ表示する場合は、正常になります。 問題は、1行で表示する場合に1個目の値は出るのですが正常な表示にはなりません。 //ソース開始 #include <stdio.h> #include <windows.h> int main() { LARGE_INTEGER i64,h64; LONGLONG work,h,m,s; QueryPerformanceCounter(&i64); QueryPerformanceFrequency(&h64); //起動時間をミリ秒取得 work = i64.QuadPart*1000 / h64.QuadPart; //時間をhに入れる h = work / 1000 / 3600; //分をmに入れる m = (work / 1000 - h * 3600) / 60; //秒をsに入れる s = work / 1000 - h * 3600 - m * 60; //表示 printf("%d時間%02d分%02d秒\n",h,m,s); printf("%d時間\n",h); printf("%d分\n",m); printf("%d秒\n",s); printf("%d秒\n",work); return 0; } //ソースここまで //実行結果 289時間00分55秒 289時間 55分 54秒 1043754590秒 続行するには何かキーを押してください . . . //理想の表示結果 1行目が以下のようになってほしい 289時間55分54秒

  • wsprintf関数(書式制御文字列)について

    wsprintf関数(書式制御文字列)について ActiveBasic 4.24.00を使用しています。 今回、wsprintf関数をつかって数列を4桁に整えたいのですが、 この関数の使い道がよく分かりません。 (大雑把に、何か規則どおりに文字列を整えるという意味で捉えている) 変数 n に数字(n=1,2,3,4,5,6・・・・・・)をForループで入れて行く途中で n=1のとき、0001 n=2のとき、0002 n=3のとき、0003 ・・・ n=10のとき、0010 n=11のとき、0011 ・・・ n=100のとき、0100 ・・・ このような感じにしたいのですが、使い方がまったく分かりません。 参考書(ABのオフィシャルユーザーガイド)などをみたら、 第二引数に、%dだの%s\%sだの、よく分からないものが書いてあります。 とりあえず、早急にしたいことは、 数列を4桁に整えることです。 もし余力がありましたら、%やdやsや\などの違いと、wsprintf関数の使い方の詳細も ご教授いただければ幸いです。 よろしくお願いします。

  • 文字列を表すための配列とポインタ

    文字列を表すための配列とポインタ  配列とポインタは同様に扱えるもの、と思って、次のプログラムを作りました。処理系は、Visual Studio 2010 コマンドプロンプトです。 #include <stdio.h> void main(void) { char a[256]; char *b; printf("文字列を入力してください。\n"); printf("例「abcde」\n\n"); printf("配列型文字列を使います。\n"); scanf("%s", a); printf("文字列は%sです。\n\n", a); printf("ポインタ型文字列を使います。\n"); scanf("%s", b); printf("文字列は%sです。\n", b); }  すると、まずコンパイル時に、 「warning C4700: 初期化されていないローカル変数'b'が使用されます」 と表示されました。そして、実行すると、「配列型文字列」の方は問題ないのですが、「ポインタ型文字列」の方の実行後に、 「x.exeは動作を停止しました。 問題が発生したため、プログラムが正しく動作しなくなりま した。プログラムは閉じられ、解決策がある場合は Windowsから通知されます。」 と表示され、エラーとして終了してしまいます。 「char *b;」 と宣言するところが問題のようですが、なぜなのかが分かりません。どなたか、解説をお願いします。

  • 文字列から文字を探す

    以下のプログラムです。 #include <stdio.h> main () { char s[]="I love cat and dog."; char c='a'; char *p=s; int n=0; printf("\"%s\"の中から\'%c\'を探します。",s,c); while(*p != '\0') { if(*p == 0) { printf("%d文字目で発見しました。\n",p-s+1); n++; } p++; } if(n == 0) printf("1つも見つかりませんでした。\n"); else printf("全部で%d個見つかりました。\n",n); } C言語の本で勉強しています。 ・p-s+1の意味がわかりません。 ここには何が割り当てられているのでしょうか? ・*pとpの違いもあいまいです。 ・\"%s\"は「"」を印刷するためには必要なのでしょうか? どう質問していいのかもわからないのですが、よろしくお願いします。

  • 文字列から数

    #include<stdio.h> int main (void){ char st[100]; printf("数字列を入力してください。"); scanf("%s",st); printf("%f %d %ld\n",atof(st),atoi(st),atol(st) ); return(0); } コマンドプロンプトから123.45と入力すると、 0.000000 123 2686588と表示されます。 %fのあたりが間違っているのでしょうか、123.45 123 123と表示されるように 御指摘お願いします。

  • 文字型配列について質問です。

    「文字型配列にsを宣言し、初期値に[yamada tagosaku ]をセットする。この文字列を表示する。次にキーボードから入力した1文字が何個含まれているかの個数を表示する。キーボードから入力する1文字は文字型変数mに、個数をカウントする変数はctにする。流れ図に従ってプログラムを作れ。」 という問題なのですが、BcPadでエラーが出てしまいます。 困っているので、訂正箇所を教えていただければ幸いです。 流れ図はhttp://imepita.jp/20080527/718540です。 int i,ct=0; char s[20]="yamada tagosaku ",m; printf("%s\n",s); printf("探す1文字 => "); scanf("%s",m);      i=0; while(s[i]!=NULL){ if(s[i]==m) ct++; i++; } printf("%s は%d個あります。\n",m,ct); }

  • 文字列の並び替えについて。

    #include<stdio.h> #include<string.h> main() {char name[40][50]; int i; for(i=1;i<=;i++){ printf("名前="); gets(name[i]); } if(strcmp(name[1],name[2])>0){ printf("%s %s \n",name[2],name[1]);} if(strcmp(name[1],name[2])<0){ printf("%s %s \n",name[1],name[2]);} if(strcmp(name[1],name[2])==0){ printf("%s %s \n",name[1]);} } は二人の名前を早い順に並べ替えるものなんですが、これを五人の名前を並べ替えるものにしたいので、どのようなプログラムにしたらいいのか教えてください。

  • 表示桁数をそろえた文字列を変数に格納したい

    ログファイルを、時間で検索するシェルスクリプトを作成したいと考えています。 変数searchStr に、ログから検索対象となる時間をループで生成したい。 例:「Jun 23 00:23」(※この文字列を作成したい。) 以下スクリプト作成しましたが 結果として、変数h、mが、1~9の時、searchStr は「Jun 23 0:23」や「Jun 23 0:3」になります。 時間と分の桁数が、変数が1ケタの場合、1→01としたい。 printfの%2dとか指定し、変数に入れてみたりしたのですが上手く文字列を生成することが出来ないのです。 (searchStr="Jun 23 `printf "%02d" $h` :" 等してみましたが、00が入っただけで、01とかになりませんでした。) #!/bin/bash for((h=0;h<24;h++)) do for ((m=0;m<59;m++)) do searchStr="Jun 23 "$h":"$m echo $searchStr #文字列確認 cat ログファイル | grep searchStr #ここで検索するための文字列を作成したい。 done done 良い解決方法がありましたら、ご教示お願いします。

  • 文字列を分解して特定の項目を別の変数に

    文字列を分解して特定の項目を別の変数に入れたいのですが、条件式を満たさないので別の変数に入れれません 下にソースを書くのですが age の項目だけ別の変数に入れたいのです どのようにすれば入れれますか? #include <stdio.h> #include <string.h> char *nameset[12],*valueset[12]; char *nameset3[12],*valueset3[12]; void main(void){ int c=0; int i=0,cn=0,dn=0; char *tm=NULL; char *han; char *a="name=miku&age=15&like=momo"; int b=strlen(a); nameset[0]=a; while((a[++i]!=NULL)&&(i<b)){ /* 項目の分解 */ if(a[i]=='='){ a[i]=NULL; if(c!=1){ valueset[cn]=a+i+1; cn++; } else{ valueset3[dn]=a+i+1; dn++; c=0; } } /* データ項目で分解 */ else if(a[i]=='&'){ a[i]=NULL; han=a+i+1; if(strcmp(han,"age")==0){ nameset3[dn]=han; c=1; } else{ nameset[cn]=han; } } } printf("%s\n", nameset[0]); printf("%s\n", valueset[0]); printf("%s\n", nameset[1]); printf("%s\n", valueset[1]); printf("%s\n", nameset[2]); printf("%s\n\n", valueset[2]); printf("%s\n", nameset3[0]); printf("%s\n", valueset3[0]); }

  • QueryPerformanceCounter の使い方の間違いの指摘をお願いします。

    Windowsの起動してからの時間を知りたいのです、QueryPerformanceCounterを使っています。 前は、timeGetTimeを使っていたのですが32ビットで47日以上はオーバーフローになってしまうので上のを使うことにしました。 QueryPerformanceCounterの使い方をいろいろ調べて見よう見まねでやってみたのですが、よく分からずtimeGetTimeのように使ったら訳の分からない値を返してきました。 明らかに、自分が間違っていることは分かるのですが、その致命的な間違いが分かりません。 MSDNより BOOL QueryPerformanceCounter( LARGE_INTEGER *lpPerformanceCount // カウンタの値 ); typedef union _LARGE_INTEGER { struct { DWORD LowPart; DWORD HighPart; }; LONGLONG QuadPart; } LARGE_INTEGER, *PLARGE_INTEGER; この時点でいまいちよく分からなかったのですが、使う部分は64ビットなので「QuadPart」だろうと思いました。 LONGLONG型・・・。 理解せずにプログラムを以下のように組みました。 私の理解では、QueryPerformanceCounterはWindowsが起動してからの時間を返してくれるものだと思っています。 #include <stdio.h> #include <windows.h> int main() { LARGE_INTEGER i64; LONGLONG count; QueryPerformanceCounter(&i64); count = i64.QuadPart; printf("LONGLONG=%lld\n" , count); return 0; } 実行結果 LONGLONG=3670653187373 続行するには何かキーを押してください . . . 実際の経過時間 1025500秒 基本がわかってないとは思うのですが、QueryPerformanceCounterが実際に返してる値とWindowsが起動してからの時間を64ビットで取得する方法を教えていただけないでしょうか? よろしくお願いします

専門家に質問してみよう