プログラムについて質問です。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
しろ

プログラムについて質問です。

#1

投稿記事 by しろ » 15年前

こちらのサイトにある以下のプログラムについて質問です。


http://karetta.jp/book-node/game-programming/235062
(一部抜粋です。お手数ではございますが、上記のサイトも併せてご参考ください)


-------------------------

//指定した位置からlen文字分表示する
for( i = 0; i < len && message[ start + i ] != '\0'; i += 2 ) {
printf("%c", message[ start + i ] ); //(1)
printf("%c", message[ start + i + 1 ]); //(2)
}
printf("\n");
}

---------------------------

なぜ(1)(2)のようにprintf関数を2行準備しないとうまく作動しないのかわかりません(もちろん「日本語はchar 2文字で表現している」という説明に対応しているのだと思いますが)。

もう少しそのあたりを詳しく説明してくださる方がいらっしゃいますと大変助かります。
何とぞよろしくお願いいたします。
(すべてのプログラムを転載するのはいろいろ問題がある気がしたので、一部抜粋にいたしました)

box

Re:プログラムについて質問です。

#2

投稿記事 by box » 15年前

>なぜ(1)(2)のように printf関数を2行準備しないとうまく作動しないのかわかりません

こう書かれているということは、printfを1つにまとめて
うまくいかなかったのですね。
もし、1つにまとめてうまくいったとすれば、その質問が出てくることが
おかしいですから。

そこで、1つにまとめてうまくいかなかったときのソースコードを見せてください。

HK

Re:プログラムについて質問です。

#3

投稿記事 by HK » 15年前

簡単に言うと、文字は種類ごとに番号付けされています。(文字コードとか言いますよね)

たとえばaは61番です。Mは4d番です。(ただし16進数)
このように半角の文字は2ケタで書けます。
しかし、この世に文字は無数にあるので、2ケタまでしかない番号では扱いきれません。
そこで、全角文字は 2ケタ+2ケタ で表すことになっています。
たとえば「あ」は 82,a0 番です。「院」は89,40 番です。


しろさんの書かれたURLのリンク先での主題は、日本語の表示の仕方とのことですので、
全角文字を扱います。
message[0] に89が入っていて、
message[1] に40が入っていたとします。そこで

printf("%c", message[0]);
printf("%c", message[1]);
と書けば、89 40 という文字番号に相当する文字「院」が描画されます。

ちなみに上記の「文字の番号」は覚える必要はありません。
http://charset.7jp.net/sjis.html
画像

しろ

Re:プログラムについて質問です。

#4

投稿記事 by しろ » 15年前

>BOXさん
>HKさん

ご説明ありがとうございます。ただおっしゃることは理解できるのですが

for( i = 0; i < len && message[ start + i ] != '\0'; i++ ) {
printf("%c", message[ start + i ] );

}

ではだめなのでしょうか。(i+=2をi++、中身を一行にしました)
これでも同じものが表示されるような気がするのですが・・・・・・

toyo

Re:プログラムについて質問です。

#5

投稿記事 by toyo » 15年前

messageが2バイト文字であれば結果は同じですね
printfを1行にしても1文字表示するのに2回のループが必要なだけで問題ありません
2行のほうは1回のループで1文字を表示したいというプログラマーの意図が読み取れます

しろ

Re:プログラムについて質問です。

#6

投稿記事 by しろ » 15年前

>toyoさん

なるほど。一行でも問題ないのですね。
2行で書かなければいけない理由があるのではないか? と疑っていました。

皆様ありがとうございました。

閉鎖

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