#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.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 になったのは
偶然ですか?
No.2ベストアンサー
- 回答日時:
printf("color_r=%x color_g=%x color_b=%x\n",color_r,color_g,color_b);
として実行してみて下さい。それぞれの配列のアドレス(先頭アドレス)が
示されます。そこから指定したバイト分がその変数の領域です。
ちなみに、この配置は処理系に依存します。
No.3
- 回答日時:
#1の方の回答にあるように偶然です。
Cの処理系によっては、奇数バイト配列のメモリ上のバウンダリをWORDで扱えるように調整するものもあるので、たまたまそうなったとしかいいようがありません。
またstrcatは文字列連結を行う関数ですが、Cでいう文字列とは「終端文字がnullである」です。
strcatは連結する文字列のnullまでを検索してそれをtarget変数に連結します。
つまり、[3]で宣言した変数にはnullが存在しないため、最悪暴走します。
このことからも、Cで文字列を取扱う場合は必ずnullが入るように1バイト追加して変数宣言するのが常識です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
H2タグを使ったときの文字の背...
-
訪問済のリンク色を変えない方法
-
リンクの下線を破線にしている...
-
htmlの文字が縦書きになる
-
HTML属性での「""」 「''」違い
-
widthやheightの数値に単位(px...
-
smallにtext-allignが効かない
-
1時間30分を簡単に表したいで...
-
htmlのolやulなどlistにtitleや...
-
リストの数字のフォントサイズ...
-
【ヒトの神秘】美男美女から何...
-
<h1>、<h2>と<p><div>の行間を...
-
input type="hidden"で取得した...
-
div要素が重なってします
-
その要素がjQueryでremove()済...
-
html/cssの、navを2段にする...
-
【HTML&CSS】フッター下部の余...
-
<li>の黒い点を消したい。
-
CSS、width100%でもできる余白
-
html タグの閉じスラッシュ前の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
HRタグ 枠線を透明にするには?
-
カラープレーンってなんですか?
-
<form <input type="text"の枠...
-
マウスオーバーでの反応速度が遅い
-
リンク部分にカーソルが来たら...
-
<pre>~</pre>について
-
CSSでクラスのエイリアス(include)
-
テキストエリア送信の際の文字...
-
smartyテンプレートの<style></...
-
スクロールバーが薄いです。
-
C# RichTextBoxで選択した文字...
-
システムカラーをRGB値に
-
HPのスクロールバーについて。
-
点線や破線を引くには
-
ホームページビルダー・表に透...
-
スマホで見ると、文字があまり...
-
訪問済のリンク色を変えない方法
-
リンクの下線の距離を変更した...
-
ビルダー インラインフレーム...
-
プログラミング言語 R グラフ
おすすめ情報