文字列と配列、関数について
Posted: 2010年6月03日(木) 08:12
こんにちは。昨日の投稿に続けての質問になります。
どうも文字列の扱いに自信がなく(「やさしいC」という本を読みましたが、いろいろと説明が載ってない!)、以下の質問をさせていただきます。ちょっと長くなってしまいますが、お許しください。
http://karetta.jp/book-node/game-programming/235064
に以下のプログラムが記載されています。
-----
#include <stdio.h>
#include <string.h>
//SHIFT_JISの場合,上位バイトが0x81~0x9F、0xE0~0xFCの範囲に収まる
//code が日本語であるか判定する
//戻り値 1:日本語 0:日本語ではない
int isJapaneseCharacter(unsigned char code)
{
if( (code >= 0x81 && code <= 0x9F) ||
(code >= 0xE0 && code <= 0xFC) ) {
return 1;
}
return 0;
}
int main()
{
char check_first[3] = "え";
char check_second[3] = "下";
char check_third[3] = "h";
printf("「え」の場合, %d\n", isJapaneseCharacter( check_first[0] ) );
printf("「下」の場合,%d\n", isJapaneseCharacter( check_second[0] ) );
printf("「h 」の場合,%d\n", isJapaneseCharacter( check_third[0] ) );
return 0;
}
-------
質問1
char check_first[3] = "え";
char check_second[3] = "下";
char check_third[3] = "h";
は
char check_first[2] = "え";
char check_second[2] = "下";
char check_third[1] = "h";
でも問題ないでしょうか?(「え」と「下」は2バイト文字、「h」は1バイト文字なので、という理解です)
--------
質問2
isJapaneseCharacter( check_thire[1] )でcheck_first[0] をcodeに渡している。
つまりcode='h'となっている。
ここで理解できないのが
code >= 0xE0という表記です。そもそも0xE0というのはポインタを表している(のだろう)と思うのですが、codeはあくまでcode='h'であり、ポインタを表すものではないような気がします。
質問3、たとえば以下のプログラムを作成したとき
---------------
#include <stdio.h>
void bcd(char *c){
printf("%s",c);
printf("%p",&c[0])
}
int main(void)
{
char a[/url]="hello";
bcd(a);
return 0;
}
-----------------
これは配列a[/url]の先頭のポインタを引き渡すことでcを配列a[/url]とみなすんですよね(みなすという言い方はおそらく間違っていると思いますが、うまい表現が思い浮かびませんでした)。
(ちなみにちょっと話がそれますが「やさしいC」には配列とポインタが「密接な関係」にあるとき、ポインタを配列として扱うことができるとありました。「密接な関係」を参考所内で定義していないのでいったいなんのことなのかさっぱりでしたが、まぁ上のような感じで理解しています)
話がごちゃごちゃしてきましたが、要は質問2の部分がわかりません。参考書にあんまり詳しく載っていないこともあり、文字列についての理解があやしく、質問3も果たして自分の理解があっているのか疑問で質問させていただきました。
よろしくお願いいたします。
どうも文字列の扱いに自信がなく(「やさしいC」という本を読みましたが、いろいろと説明が載ってない!)、以下の質問をさせていただきます。ちょっと長くなってしまいますが、お許しください。
http://karetta.jp/book-node/game-programming/235064
に以下のプログラムが記載されています。
-----
#include <stdio.h>
#include <string.h>
//SHIFT_JISの場合,上位バイトが0x81~0x9F、0xE0~0xFCの範囲に収まる
//code が日本語であるか判定する
//戻り値 1:日本語 0:日本語ではない
int isJapaneseCharacter(unsigned char code)
{
if( (code >= 0x81 && code <= 0x9F) ||
(code >= 0xE0 && code <= 0xFC) ) {
return 1;
}
return 0;
}
int main()
{
char check_first[3] = "え";
char check_second[3] = "下";
char check_third[3] = "h";
printf("「え」の場合, %d\n", isJapaneseCharacter( check_first[0] ) );
printf("「下」の場合,%d\n", isJapaneseCharacter( check_second[0] ) );
printf("「h 」の場合,%d\n", isJapaneseCharacter( check_third[0] ) );
return 0;
}
-------
質問1
char check_first[3] = "え";
char check_second[3] = "下";
char check_third[3] = "h";
は
char check_first[2] = "え";
char check_second[2] = "下";
char check_third[1] = "h";
でも問題ないでしょうか?(「え」と「下」は2バイト文字、「h」は1バイト文字なので、という理解です)
--------
質問2
isJapaneseCharacter( check_thire[1] )でcheck_first[0] をcodeに渡している。
つまりcode='h'となっている。
ここで理解できないのが
code >= 0xE0という表記です。そもそも0xE0というのはポインタを表している(のだろう)と思うのですが、codeはあくまでcode='h'であり、ポインタを表すものではないような気がします。
質問3、たとえば以下のプログラムを作成したとき
---------------
#include <stdio.h>
void bcd(char *c){
printf("%s",c);
printf("%p",&c[0])
}
int main(void)
{
char a[/url]="hello";
bcd(a);
return 0;
}
-----------------
これは配列a[/url]の先頭のポインタを引き渡すことでcを配列a[/url]とみなすんですよね(みなすという言い方はおそらく間違っていると思いますが、うまい表現が思い浮かびませんでした)。
(ちなみにちょっと話がそれますが「やさしいC」には配列とポインタが「密接な関係」にあるとき、ポインタを配列として扱うことができるとありました。「密接な関係」を参考所内で定義していないのでいったいなんのことなのかさっぱりでしたが、まぁ上のような感じで理解しています)
話がごちゃごちゃしてきましたが、要は質問2の部分がわかりません。参考書にあんまり詳しく載っていないこともあり、文字列についての理解があやしく、質問3も果たして自分の理解があっているのか疑問で質問させていただきました。
よろしくお願いいたします。