#include <iostream.h>
main(){
char color_r[12], color_g[3], color_b[3];
sprintf(color_b, "%d", 123);
sprintf(color_g, "%d", 456);
sprintf(color_r, "%d", 789);
strcat(color_r,",");
strcat(color_r,color_g);
strcat(color_r,",");
strcat(color_r,color_b);
cout << color_r;
printf("\n%s",color_r[11]);
}
結果は
789,456,123
(null)
問題ない。
でも、Winプログラムだと問題がある。
#include <windows.h>
#include <iostream.h>
。。。
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
char color_r[12], color_g[3], color_b[3];
sprintf(color_b, "%d", 123);
sprintf(color_g, "%d", 456);
sprintf(color_r, "%d", 789);
strcat(color_r,",");
strcat(color_r,color_g);
strcat(color_r,",");
strcat(color_r,color_b);
TextOut(hdc,10,10,color_r,strlen(color_r));
EndPaint(hWnd, &ps);
break;
結果は、実行時エラーです。
えらーだけど、TextOut( ) での表示が
789,456,123456
となっているのは見れる。
456 というのがくっく。
これが問題。
char color_r[12], color_g[4], color_b[4];
として \0 の領域を用意してやれば問題は起こらないけど、
[4] にしたとして、\0 がどのように作用しているのかが
分かりません。
[3] のエラーは
strcat(color_r,color_b);
の次に
strcat(color_r,"\0");
を書けばいいような気がしてやってみたけど、
結果は変わらず、実行時エラー。
やっていることは GetPixel( ) の3色分離だけど、
配列の \0 をケチって宣言すると、
R,G,B が、R,G,BG となってしまうことが分かったけど
どうして R,G,BG になるのかを知りたいです。
No.3
- 回答日時:
#1の方の回答にあるように偶然です。
Cの処理系によっては、奇数バイト配列のメモリ上のバウンダリをWORDで扱えるように調整するものもあるので、たまたまそうなったとしかいいようがありません。
またstrcatは文字列連結を行う関数ですが、Cでいう文字列とは「終端文字がnullである」です。
strcatは連結する文字列のnullまでを検索してそれをtarget変数に連結します。
つまり、[3]で宣言した変数にはnullが存在しないため、最悪暴走します。
このことからも、Cで文字列を取扱う場合は必ずnullが入るように1バイト追加して変数宣言するのが常識です。
No.1
- 回答日時:
R,G,BG になるのは、たまたまそうなったと考えてください。
strcatは、文字列を扱う関数なので、
char color_r[12], color_g[3], color_b[3];
で宣言した場合、\0を入れていないため、宣言していない領域外までくっつけてしまうことになります。
この場合、color_g[3]の次が偶然\0だったと思ってください。
color_b[3]の次に、color_g[3]の領域が取られていたと思ってください。
ですので、コンパイルし直すと、違う結果が出てくるかもしれないです。
この回答への補足
必ず R,G,BG になるわけではないけど、
取得する色によって結果が違うんだけど、
R,G,BG になることが多いんです。
Winプログラムの方で、領域外までくっつけてしまうことになるのは
どの行ですか?
それはコンソールの方では起こらないんですか?
コンソールの方で
printf("\n%s",color_r[11]); が \0 になったのは
偶然ですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS プログラムの関連性を教えて下さい。 1 2023/07/19 03:50
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
- HTML・CSS アコーディオンメニューが思うように動作しません。 1 2023/08/20 16:48
- HTML・CSS cssの display: flex;で横並びにならずに困ってます 1 2022/12/04 13:18
- HTML・CSS cssが効かなくて困ってます 1 2023/01/01 23:57
- オープンソース cssで中央寄せ 1 2023/05/19 06:25
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- その他(IT・Webサービス) cssの@mediaについて 1 2023/05/14 07:34
- HTML・CSS img と p を縦中央に配置したいのですがうまくいきません。 2 2023/01/12 14:38
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<form <input type="text"の枠...
-
リンク部分にカーソルが来たら...
-
カラープレーンってなんですか?
-
HRタグ 枠線を透明にするには?
-
横スクロールバーを表示したい
-
<pre>~</pre>について
-
スクロールバーが薄いです。
-
html で文字の色が出てこない。
-
カーソルを乗せると、文字の色...
-
htmlの文字が縦書きになる
-
htmlのolやulなどlistにtitleや...
-
複数のボタンを等間隔に、かつ...
-
widthやheightの数値に単位(px...
-
リンクを知らせる手のマークが...
-
<div id="container">の使いか...
-
smallにtext-allignが効かない
-
番号付きリスト(<Ol><Li>・・...
-
<ul>~</ul>が二つ続くと間に改...
-
外部スタイルシートで定義した...
-
IEでスクロールできない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<form <input type="text"の枠...
-
訪問済のリンク色を変えない方法
-
HRタグ 枠線を透明にするには?
-
<pre>~</pre>について
-
CSSでクラスのエイリアス(include)
-
カラープレーンってなんですか?
-
ホームページビルダー 水平線に...
-
テキストボックスの文字の大き...
-
横スクロールバーを表示したい
-
リンク下のアンダーラインの消し方
-
リンクのアンダーバーを消した...
-
秀丸の正規表現を使って<FONT c...
-
\\0 sprintf( ) strcat( )
-
Pandas の groupby後の要素の参...
-
リンクの下線を消す
-
白い文字と黒い文字を出すため...
-
はじめて利用します。質問の上...
-
C# RichTextBoxで選択した文字...
-
HP作成(スクロールバーの色)
-
bodyの背景と異なる背景色で、...
おすすめ情報