• ベストアンサー

C言語で文字列バッファを消去する方法

今、C言語とWin32 APIを使ってプログラミングをしています。 wsprintf(str,TEXT("プレイヤーの攻撃!")); TextOut(hdc,0,520,bstr,lstrlen(str)); if(ehp <= 0) {    wsprintf(str,TEXT("敵を倒しました"));    TextOut(hdc,0,520,bstr,lstrlen(str)); } このコードを実行すると、2回目のTextOutのところで 「敵をたおしました撃!」と出てしまいます。 きっとstrに以前の文字列が残っているからだと思いますが、 この保存した文字列を消去するにはどうしたらよいのでしょうか? for文でstr[0]から'\0'までナル文字を代入し続けたり、いろいろと試したのですが駄目でした。どうかこんな自分にご助力お願いできないでしょうか? どうかお願い致します。

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

  • ベストアンサー
  • arain
  • ベストアンサー率27% (292/1049)
回答No.2

これ、文字列バッファの問題じゃなく、TextOut()の問題ですよ。 要は、「プレイヤーの攻撃!」という文章が書かれている紙を黒板に貼り付けた上に、「敵を倒しました」という文章の紙を貼り付けています。 後から貼り付けた文章の紙の方が前の文章より短いので全部隠れることがなく表示されています。 hdcの表示領域を消去(背景色と同じ色で塗る)か、文章の最大長に合わせて短い文の後ろにスペースを追加するといった処理が必要です。

dfjews
質問者

お礼

自分の見当が違っていたようです…。 非常にわかりやすい説明で助かります。ありがとうございます! スペースを入れて対処していきます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「str に以前の文字列が残っているからだと思いますが」というのは, 多分間違い. TextOut の仕様で「その文字列を出力するのに必要な分しか書いていない」からだと思います. で, この仕様がわかれば「どうすればいいか」は単純で, 例えば str のうしろに空白を適当につけたり TextOut で出力する前にクリアしたりすれば OK.

dfjews
質問者

お礼

なるほど、TextOutのほうだったわけですね。 気づきませんでした…。 対策まで提示して下さって誠にありがとうございます。 助かりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • wsprintf( ポインタ , "%d" , "123" );

    char str[100]; char *ptr; wsprintf(str, "%d", "1234567"); と wsprintf(ptr, "%d", "1234567"); について、 TextOut(hDC,0,10,str,lstrlen(str)); TextOut(hDC,0,30,ptr,lstrlen(ptr)); で出力したいんだけど、str ならできたけど、 ptr の方が文字化けしていました。 lstrlen(ptr); がいけないのかと思って、 その値を調べたら 0 でした。 strlen( ) はポインタに対応していると思いました。 #include <iostream.h> main(){ char *p = "あいう"; cout << strlen(p); } で 6 だったから。 Win32 の lstrlen( ) はポインタに対応していないんですか?

  • (SHORT)

    ウインドウプロシージャ内ですが、(SHORT)は何のためについているんでしょうか?(どんな効果がありますか) 教えてください。 case WM_MOUSEWHEEL :     wsprintf(str,TEXT("WHEEL %s"),        ((SHORT)HIWORD(wparam))>0 ? TEXT("↑"):TEXT("↓"));     hdc=GetDC(hwnd);     TextOut(hdc,0,0,str,lstrlen(str));

  • Windows APIでおかしな事になる。

    Windows APIでプログラミングをしています。 Windows APIでプログラミングをしています。 char*型の文字列を表示させようと、このように記述しました。 const char * y; y=f(); SelectObject(hdc , hFont); SetBkColor(hdc , RGB(255 , 255 , 255)); wsprintf( str, "名前は、%s", y ); TextOut(hdc , 300, 20, str, lstrlen(str)); すると、表示できたのはいいのですが、 タイトルバーをクリックしてウィンドウを広げたり、別のウィンドウを一番前に持ってきて、 その後、そのウィンドウを出したりすると、エラーが出て、強制終了になってしまします。 何か問題はありますか? ちなみに、strの宣言はこのようになっております。 static TCHAR str[64]; あとですが、 wsprintf( str, "名前は、%s", y ); この部分のyを&yに変えると、エラーは起こりませんが、 変な文字が表示されてしまいます。 ウィンドウを少し操作すると、その文字がまた変な文字に変わります。 何が原因でしょうか。

  • wParam

    wParamは、unsigned int型で、仮想キーコードを、格納してますよね。 wsprintf()内で(TCHAR)キャストしてますが、 これは、変数strの型がTCHAR型なので(wParamは、unsigned intなので型をあわせるために)やっているんですか? (TCHAR)キャストしないとエラーになりますか?教えてください。 HDC hdc; TCHAR str[255]; swich(umsg){   case WM_CHAR:     wsprintf( str, TEXT("%c"), (TCHAR)wPara );     hdc = GetDC(hwnd);     TextOut(hdc, 0, 0, str, lstrlen(str));     return0 }

  • ファイルを開く。(API・C言語)

    case WM_RBUTTONUP: GetOpenFileName(&ofn); SetWindowText(hWnd , strFile); return 0; ↑のソースは、ウィンドウを右クリックした後、ファイル名をタイトルバーに表示させるものなのですが、この、strFileを、ウィンドウの画面上に表示させるのに、 SelectObject(hdc , hFont); SetBkColor(hdc , RGB(255 , 255 , 255)); TextOut(hdc , 40, 10, strFile, lstrlen(strFile)); で表示させてみようとしたところ、エラーが発生し、できませんでした。どうやるのでしょうか。ちなみに、strFileはstatic TCHAR型です。 また、ウィンドウから読み込んだテキストファイルを、ある文字列がどれだけあるか、などを数え、その後、その数を表示させたりもさせるプログラムを作っています。それで分からなかったのが、読み込んだファイルはTCHAR型ですよね。それをどうやってchar型に直すかです。 宜しくお願い致します。

  • wsprintf関数の使い方について

    いつもお世話になっております。   いまいち、分からなくて質問しました。     int hp=60; としたとき、   TextOut(.............,hp,lstrlen(hp)); としようと思ってたんですけど、   文字がでないので、     wsprintf((LPWSTR)nowhp,"%d",hp); としたら、エラーがでて実行できませんでした。   TextOut関数で、60とだしたいのですが、 その後の処理で値が変わってくるので   TextOut(......................,TEXT("60")..........)   ともできず、困っています。      要は wsprintfに値を格納して その後の処理で   hp-=10   としても、 wsprintfでnowhpに値を格納し TextOutで50と表示されるようにしたいのです。     うまく説明できませんが、↑のようにする方法を   教えてください。   お願いします。

  • SDKでウィンドウの中央に文字列を表示させる方法

    ウィンドウの中央に文字列sを表示させる方法を教えて下さい。 /********************************** WM_PAINTで TCHAR s[80]; HDC hDC; PAINTSTRUCT ps; RECT rc; GetClientRect(hWnd, &rc); hDC = BeginPaint(hWnd, &ps); TextOut(hDC, rc.right / 2, rc.bottom / 2, tcDayTime, lstrlen(s)); EndPaint(hWnd, &ps); return FALSE; ***********************************/ GetClientRect(hWnd, &rc);でウィンドウのサイズを取得し、 TextOutの第2、第3引数で ウィンドウ幅/2、ウィンドウ高さ/2 としていますが、これだと中央から表示されてしまいます。 できれば、ウィンドウのサイズを変更してもウィンドウの中央に表示させたいです。 #VC ++ 6.0 & Win98 & SDK で作成してます。

  • C言語 キーボードで入力された文字列を表示する方法

    はじめまして。 C言語を学習中です。 参考書の例文に、自分なりにコメントを付けて読み進めましたが、どうしても下記のfor文の処理が理解ずに困っております。 for (j = 0;j < i;j++) printf("%d\n",val[j]); なぜval[j](ジェイ)が出てくるのかがわかりません。 val[j](ジェイ)はval[i](アイ)とどのような関連性があるのでしょうか。 また、最後のfor文はどのような処理をしているのでしょうか。 どうか教えていただきたく、お願い致します。 ●例文 次のプログラムは、入力された数値の一覧を表示する例です。 #include <stdio.h> #include <stdlib.h> #include <string.h> void main(void) { int i,j,val[10]; char str[32],*ch; fgets(str,sizeof(str),stdin); /*キーボードで入力された文字列strを読込む*/ ch = strtok(str,",\n");   /* 文字列strの中から単語を取り出して変数chに代入*/ for (i = 0;i < 10;i++) {   /*for文(初期化i=0;条件式i<10;更新i++)*/ if (ch == NULL) {   /*文字列strの中に単語が無ければ*/ break;   /*ループを抜ける*/ } else {   /*文字列strの中に単語があれば*/ val[i] = atoi(ch); /*文字列strの中の最初の単語を数値に変換して配列valの                        i要素に代入する*/ } ch = strtok(NULL,",\n");  /*文字列strの中の次の単語を取り出す*/ } for (j = 0;j < i;j++) printf("%d\n",val[j]); return; } このプログラムの実行結果は次の通りになります。 85,41,26,956,12 入力した文字列 85 41 26 956 12

  • TextOut( ) を BeginPaint( ) と GetDC( )

    LRESULT CALLBACK の case WM_PAINT: で、 hdc = BeginPaint(hWnd, &ps); TextOut(hdc,0,0,str,strlen(str)); EndPaint(hWnd, &ps); ↑問題無し。↓文字がちらつく。 hdc = GetDC(hWnd); TextOut(hdc,0,0,str,strlen(str)); ReleaseDC(hWnd,hdc); ちらつきの原因は、高速で TextOut( ) が繰り返されるから だと思いました。 どうして TextOut( ) が繰り返されるんですか? 上の方法の場合は、 ReleaseDC(hWnd,hdc); は書かなくてもいいですか?

  • C言語で変数を初期化するにはどうすればよいでしょうか。

    こんにちは。 C言語で、一度文字列を入力した変数(ポインタとか配列のことを含めてます)を再度初期化することは可能でしょうか。「初期化」という表現が合っているのか自信はないのですが、要は一度変数に入れた文字列を消去して、再利用する方法を探しています。 目標は、 1.ファイルに変数の文字列を出力する FILE *fp = fopen("file.txt","w") char *str = "text" fprintf(fp,"%s",str) ↓ 2.その変数は初期化し、初期化した変数にまた文字列を代入する *str = 初期化 *str = "text2"; ↓ 3.それをまたファイルに出力する(以下エンドレス) fprintf(fp,"%s",str) という流れにしたいのですが、2.の「初期化」がわからないので、文字列を代入すると、最初にいれた"text"のあとに"text2"がくっついてくる形になってしまい困っています。 これだとstrの容量が大きくなってしょうがないですし、ファイルに出力される文字列も重複したものになってしまうので、いったんstrに入っている文字列を消去してしまって、また新たにstrに文字列を入れようと思っているのですが可能でしょうか。 1~3の動作をほぼエンドレスでやりたいので、新たに変数を作るというやり方意外に何か良い方法があれば教えて頂けないでしょうか。どうぞ宜しくお願いします。

年賀状印刷に関するお困りごと
このQ&Aのポイント
  • エクセルで宛名を印刷しました。この後どのように印刷すればよいのかご教示ください。
  • お使いの環境はWindows11で、無線接続されています。
  • 関連するソフト・アプリはなく、マンションの備え付けの電話回線を使用しています。
回答を見る

専門家に質問してみよう