ノベル風のcase文で
ノベル風のcase文で
以下のサイト→http://homepage2.nifty.com/natupaji/DxL ... m.html#N20
を参考にしてノベル風画面を作成しており
case文でcase'a'、case'a2'、case'a3'・・・という風に作っていきたいのですが
なぜかcase'a2'、case'a3'が読み込まれません。(case'a'は読みこまれます)
どうも2文字以上になると読みこまれないみたいで。。。
条件分岐等でcase文を大量に作る必要があるので
原因が分かる方よろしくお願いします
を参考にしてノベル風画面を作成しており
case文でcase'a'、case'a2'、case'a3'・・・という風に作っていきたいのですが
なぜかcase'a2'、case'a3'が読み込まれません。(case'a'は読みこまれます)
どうも2文字以上になると読みこまれないみたいで。。。
条件分岐等でcase文を大量に作る必要があるので
原因が分かる方よろしくお願いします
Re:polpol
'a'
は変数を表しているのではなく、文字コードを表しているんですよ。
文字というものは、「文字」で管理されているのではなく、文字を表す数字すなわち文字コードで管理されています。
試しに
char str[10]="hello";
printf("%d %d %d %d %d", str[0],str[1],str[2],str[3],str[4]);
こんな感じで文字がいくつの数字で表されているか確認して見て下さい。
詳しくは
http://e-words.jp/p/r-ascii.html
そして、シングルコーテーションで文字を囲むとその文字の文字コードが表せます。
すなわち上記場合であれば
if( str[0] == 'h' )
は真となります。
if( str[0] == 104 )
でも同じですね。
しかし、'a2'という文字コードはありません。a2を表そうとすると
char str[3] = "a2";
のように文字列に格納する必要があります。aと2は別の文字コードで表され、文字列の最後には終端記号が入ります。
ところで何故そんなにも大量なcaseが必要なのでしょう?
は変数を表しているのではなく、文字コードを表しているんですよ。
文字というものは、「文字」で管理されているのではなく、文字を表す数字すなわち文字コードで管理されています。
試しに
char str[10]="hello";
printf("%d %d %d %d %d", str[0],str[1],str[2],str[3],str[4]);
こんな感じで文字がいくつの数字で表されているか確認して見て下さい。
詳しくは
http://e-words.jp/p/r-ascii.html
そして、シングルコーテーションで文字を囲むとその文字の文字コードが表せます。
すなわち上記場合であれば
if( str[0] == 'h' )
は真となります。
if( str[0] == 104 )
でも同じですね。
しかし、'a2'という文字コードはありません。a2を表そうとすると
char str[3] = "a2";
のように文字列に格納する必要があります。aと2は別の文字コードで表され、文字列の最後には終端記号が入ります。
ところで何故そんなにも大量なcaseが必要なのでしょう?
Re:polpol
画面遷移が沢山あるならテーブル化して関数ポインタを作ったほうがシンプルになります。
ただ、メッセージ量や遷移の多いものを作ろうとしているなら、もっと考えないと破綻します。
こちらを参考にするとか。
http://www.usamimi.info/~guiprog/game/
こちらのスクリプトプレーヤーを参考にしてみてください。
http://homepage2.nifty.com/natupaji/DxLib/dxsample.html
ただ、メッセージ量や遷移の多いものを作ろうとしているなら、もっと考えないと破綻します。
こちらを参考にするとか。
http://www.usamimi.info/~guiprog/game/
こちらのスクリプトプレーヤーを参考にしてみてください。
http://homepage2.nifty.com/natupaji/DxLib/dxsample.html
Re:polpol
失礼します。
Mojiは整数型なのでしょうか?
上にある宣言との関係もいまいちわからなくて…
上のサイト行ってみましたが全部読むのは骨が折れそうで・・・
どこに宣言あるかだけでもいいですが・・・
(もしくは役割)
それと私の想像道理の場合↓
void main(void){
printf("%d",'1');
}
これの結果が「1」だと思ってないでしょうか?
勘違いの場合すいませんが…
ちなみに
void main(void){
printf("%d",'1'-'0');
}
これが結果「1」です。
========
勘違いの場合は本当に申し訳ないです。
すいません。
Mojiは整数型なのでしょうか?
上にある宣言との関係もいまいちわからなくて…
上のサイト行ってみましたが全部読むのは骨が折れそうで・・・
どこに宣言あるかだけでもいいですが・・・
(もしくは役割)
それと私の想像道理の場合↓
void main(void){
printf("%d",'1');
}
これの結果が「1」だと思ってないでしょうか?
勘違いの場合すいませんが…
ちなみに
void main(void){
printf("%d",'1'-'0');
}
これが結果「1」です。
========
勘違いの場合は本当に申し訳ないです。
すいません。

Re:polpol
#include<stdio.h>
int main(void){
int a;
printf("\n");
for(a=33;a<57+33;a++){
printf("%d::%c\t",a+57*0,a+57*0);
printf("%d::%c\t",a+57*1,a+57*1);
printf("%d::%c\t",a+57*2,a+57*2);
printf("%d::%c\n",a+57*3,a+57*3);
}
}
これなんてどうでしょうか?
文字コードが出るようにしたつもりですが…
それとMojiが一文字ならcase 'a'などでいいのではないでしょうか?
2文字なら判定の前に数字に直すようにするべきです。
もう一度聞きますが、
数字と数値の違いはわかりますか?
========
一応intに変更しておきました。
int main(void){
int a;
printf("\n");
for(a=33;a<57+33;a++){
printf("%d::%c\t",a+57*0,a+57*0);
printf("%d::%c\t",a+57*1,a+57*1);
printf("%d::%c\t",a+57*2,a+57*2);
printf("%d::%c\n",a+57*3,a+57*3);
}
}
これなんてどうでしょうか?
文字コードが出るようにしたつもりですが…
それとMojiが一文字ならcase 'a'などでいいのではないでしょうか?
2文字なら判定の前に数字に直すようにするべきです。
もう一度聞きますが、
数字と数値の違いはわかりますか?
========
一応intに変更しておきました。

Re:polpol
> パコネコさん
返答ありがとうございます
printf("\n");
for(a=33;a<57+33;a++){
printf("%d::%c\t",a+57*0,a+57*0);
printf("%d::%c\t",a+57*1,a+57*1);
printf("%d::%c\t",a+57*2,a+57*2);
printf("%d::%c\n",a+57*3,a+57*3);
}
というコードを通すと文字コードが自動変換されるのですね
ちょっと試してみます
> 数字と数値の違いはわかりますか?
初心者なのでよく分かりません^^;
>Dixqさん
失礼しました。
上で書いたリンクを参考に
例えば9の文字コードは57で
以下のように書いたらうまく読み込んだのですが
char String[/url][ 256 ] =
{
"○○○○○○○○9" ,
} ;
switch( Moji )
{
case 57;
}
ただその後のa2をcaseに書く場合char str[3] = "a2"; を
どのように上のコードに組み込むのかがよく分かりませんでした
返答ありがとうございます
printf("\n");
for(a=33;a<57+33;a++){
printf("%d::%c\t",a+57*0,a+57*0);
printf("%d::%c\t",a+57*1,a+57*1);
printf("%d::%c\t",a+57*2,a+57*2);
printf("%d::%c\n",a+57*3,a+57*3);
}
というコードを通すと文字コードが自動変換されるのですね
ちょっと試してみます
> 数字と数値の違いはわかりますか?
初心者なのでよく分かりません^^;
>Dixqさん
失礼しました。
上で書いたリンクを参考に
例えば9の文字コードは57で
以下のように書いたらうまく読み込んだのですが
char String[/url][ 256 ] =
{
"○○○○○○○○9" ,
} ;
switch( Moji )
{
case 57;
}
ただその後のa2をcaseに書く場合char str[3] = "a2"; を
どのように上のコードに組み込むのかがよく分かりませんでした
Re:polpol
出来ますが、果たしてそのようなデータ管理が適切なんでしょうか・・。
最初は学習が面倒かもしれませんが、softyaさんが示してくださったリンク先を読むなどして、
サウンドノベルの設計についてきちんと学んだ上で設計した方が後々楽だと思いますよ。
それでも我流が良いという事でしたら・・。
文字列のデータを数値に変換する時はatoi等を使います。
例えば
文字列で表現した「12」はintの「12」とは違います。
文字コードが 49 50 と並んでいるデータ配列になっています。
これを12にするにはどうしたらいいかというと
int a;
char str[3]="12";
a = atoi(str);
このようにすると文字列である12がint型の12になります。
パコネコさんも仰っているように、1は0より文字コードが1つ大きい事を利用して変換出来ます。
'1'-'0'は数値として1です。同様に'2'-'0'は2ですね。
'1'-'0'を10倍して'2'-'0'を足すとatoi関数は無くても計算出来ます。
まず文字は文字コードで管理されているという事をしっかり理解する為に、
「文字列を受け取ったらint型の数値で返す関数」を自作すると良く解ると思います。
最初は学習が面倒かもしれませんが、softyaさんが示してくださったリンク先を読むなどして、
サウンドノベルの設計についてきちんと学んだ上で設計した方が後々楽だと思いますよ。
それでも我流が良いという事でしたら・・。
文字列のデータを数値に変換する時はatoi等を使います。
例えば
文字列で表現した「12」はintの「12」とは違います。
文字コードが 49 50 と並んでいるデータ配列になっています。
これを12にするにはどうしたらいいかというと
int a;
char str[3]="12";
a = atoi(str);
このようにすると文字列である12がint型の12になります。
パコネコさんも仰っているように、1は0より文字コードが1つ大きい事を利用して変換出来ます。
'1'-'0'は数値として1です。同様に'2'-'0'は2ですね。
'1'-'0'を10倍して'2'-'0'を足すとatoi関数は無くても計算出来ます。
まず文字は文字コードで管理されているという事をしっかり理解する為に、
「文字列を受け取ったらint型の数値で返す関数」を自作すると良く解ると思います。
Re:polpol
きれいな形ではないですが、
全部タイプ分けするなら…
switch(Moji[0]){
case 'a':
switch(Moji[1]){
case '9'://処理
}
break;
}
こういうことでもやりたいことはできると思います。
もっといい方法もあるとは思いますが…すぐには思いつかなかったので、
とりあえず一つの方法ではあります。
ただしaaaというように桁数が増えるなら数値※に変換したほうがいいですね。
'9'が9ではなく57?であることはわかっていらっしゃるようなので、
数字と数値の違いはもうわかっているようですね。
文字データとしての数は「数字」書いて字のごとく数の字ですね。
計算などに使うような「数値」はこれもそのまま数の値です。
間違ったことはいってないと思いますが、
いつか「ちゃんとした人」に勉強させてもらっていたほうがいいです。
(必ず’9’は57ともいえませんが…)
if(9=='9'-'0')
は成り立ちます。
※編集しました
全部タイプ分けするなら…
switch(Moji[0]){
case 'a':
switch(Moji[1]){
case '9'://処理
}
break;
}
こういうことでもやりたいことはできると思います。
もっといい方法もあるとは思いますが…すぐには思いつかなかったので、
とりあえず一つの方法ではあります。
ただしaaaというように桁数が増えるなら数値※に変換したほうがいいですね。
'9'が9ではなく57?であることはわかっていらっしゃるようなので、
数字と数値の違いはもうわかっているようですね。
文字データとしての数は「数字」書いて字のごとく数の字ですね。
計算などに使うような「数値」はこれもそのまま数の値です。
間違ったことはいってないと思いますが、
いつか「ちゃんとした人」に勉強させてもらっていたほうがいいです。
(必ず’9’は57ともいえませんが…)
if(9=='9'-'0')
は成り立ちます。
※編集しました
Re:polpol
>Dixqさん
なるほど。本格的に作るならsoftyaさんが示してくださったリンク先
を学んだほうがいいのですね。
ちょっと分からない所があって折れたんですがもう一度やってみます。
>果たしてそのようなデータ管理が適切なんでしょうか・・
確かにcase文に入れる文字をいちいち変換して読み込ませるのは
回りくどいというか効率が悪そうですね・・・
でも一度教えてくださったatoi関数というので色々といじってみます
> パコネコさん
> ただしaaaというように桁数が増えるなら数値※に変換したほうが
そうですね。Dixqさんの関数化して数値を返すようにすればいいのですね
ヒントを頂いたので作りやすいと思います。
なんとなく分かってきたので一旦解決ということにします
ありがとうございました。
なるほど。本格的に作るならsoftyaさんが示してくださったリンク先
を学んだほうがいいのですね。
ちょっと分からない所があって折れたんですがもう一度やってみます。
>果たしてそのようなデータ管理が適切なんでしょうか・・
確かにcase文に入れる文字をいちいち変換して読み込ませるのは
回りくどいというか効率が悪そうですね・・・
でも一度教えてくださったatoi関数というので色々といじってみます
> パコネコさん
> ただしaaaというように桁数が増えるなら数値※に変換したほうが
そうですね。Dixqさんの関数化して数値を返すようにすればいいのですね
ヒントを頂いたので作りやすいと思います。
なんとなく分かってきたので一旦解決ということにします
ありがとうございました。