トップページ > 記事閲覧
strchrとstrtokについて
名前:炎の銃器 日時: 2016/05/04 15:37

はじめまして。 長文になりますが失礼いたします。 strchrとstrtokについて思うように動作しなかったため、 自分のプログラムに不備がないかどうか、質問させていただきます。 使用したバージョンはVer 3.16bです。 コントローラーなどのボタンを押すと音が鳴る「サンプラー」を再現しようと思っています。 プログラムをいじらずにtxtファイルと素材ファイルの入れ替えで自由に音が変えれる物を想定しています。 まず、txtファイルに サウンド(パンチ1).mp3|サウンド(パンチ2).mp3|サウンド(パンチ3).mp3 サウンド(キック).mp3 サウンド(ばさっ).mp3 サウンド(斬る).mp3 と用意し、 @ FileRead_gets()で1行づつ読み込む A 変数にその1行を代入 B if文にてstrchrで'|'が含まれているかを確認 C 含まれているならstrtokで分割を行い、含まれていないなら分割を行わない D 配列にそれぞれをいれる(分割しないなら[0]だけ、するなら[0]〜[2]のように) E LoadSoundMemでそれぞれの音を読み込む 上のようにしたかったのですが、 Bでstrchrの条件の「|」が「ッ」でも反応しているような挙動をします。 同様にCのstrtokでも「|」だけで分割したいのに「ッ」でも分割されてしまいました。 私の組んだプログラムを下にのせますので、確認をお願いできますでしょうか? ---------------------------------------------------------------------------------------------- #define MAXKEY 16 #define NUM 3 char se_Name[MAXKEY][NUM][256]; int se_Handle[MAXKEY][NUM]; int handle = FileRead_open("音/SE/SE_List.txt"); for( int i = 0; i < MAXKEY; i++ ){ char data[256]; if( FileRead_eof( handle ) != 0 ){ break; } FileRead_gets( data, 256, handle ); if( strchr( data, '|' ) == NULL ){ strcpy( se_Name[i][0], data ); }else{ for( int j = 0; j < NUM; j++ ){ if( j == 0 ){ strcpy( se_Name[i][j], strtok( data, "|" ) ); }else{ strcpy( se_Name[i][j], strtok( NULL, "|" ) ); } } } for( int j = 0; j < NUM; j++ ){ se_Handle[i][j] = LoadSoundMem( strcat( "音/SE/" , se_Name[i][j] ); } } FileRead_close(handle); ---------------------------------------------------------------------------------------------- 読み込みの部分のみ一部抜粋
メンテ

Page: 1 |

Re: strchrとstrtokについて ( No.1 )
名前:管理人 日時:2016/05/05 18:19

strtok が意図した通りに動作しない原因は "|" の | の文字が全角文字だからです ABCアイウ012 のような半角文字は1文字1バイトなのですが、ABCあいう012 などの 全角文字は1文字2バイトとなっています そして、strchr や strtok の第二引数で指定する文字には「1文字1バイトの文字」しか 使用することができません、つまり半角文字しか使用できないのです strchr や strtok が1文字が2バイトである全角文字に対応していないので、意図した 通りの動作をしてくれない、というわけです 対策としては、区切りの文字である『|』を全角の『|』から半角の『|』に変更という 方法があります 試しに SE_List.txt の区切り文字を『|』から『|』に変更して、プログラムの strchr や strtok の第二引数も『|』から『|』に変更したところ正常に動作しましたので よろしければお試しください m(_ _)m ( 因みに世の中には半角文字も全角文字も1文字2バイトの世界や、半角文字は  1文字1バイトだけと全角文字は1文字3バイトだったりする世界もありますが、  これらの文字コードのことを詳しくご説明しようとするときりがなくなってしまうので  今回は割愛させてください( もし興味がありましたら『文字コード』『Shift_JIS』  『UTF-8』『UTF-16』などのキーワードでネット検索してみてください ) )
メンテ
Re: strchrとstrtokについて ( No.2 )
名前:炎の銃器 日時:2016/05/05 21:24

ご返答いただきありがとうございます。 なるほど、strchr と strtok はそういうものだったのですね・・・ 変更してみたところ、意図したように動きました。 見た目的に全角文字だと区切りとして使いやすかったのですが、 そういう落とし穴が・・・ 次からはもっと説明文をよく読んでプログラミングしていこうと思います。
メンテ
Re: strchrとstrtokについて ( No.3 )
名前:炎の銃器(解決) 日時:2016/05/05 21:25

解決にするの忘れてました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存