- ベストアンサー
gets()で得たものの配列化
こんにちは。Cプログラミング初心者です。 gets()で得た空白付文字列を、 コマンドライン入力のargv[]のように配列化したいです。 例: 入力:This is a pen. tmess[0] This tmess[1] is tmess[2] a tmess[3] pen. 区切り文字列" "で、strtok()を使えばよいかと思いましたが、 空白が認識されずエラーが出てしまいます。 int flag,n=0,i; char *mess,**tmess; gets(mess); flag=strtok(mess," "); if(flag!=NULL){ while(flag!=NULL){ tmess[i]=flag; flag=strtok(NULL," "); n++; } どうすれば空白を認識してくれるのでしょうか? また、他に良い方法があるのでしょうか.. 回答よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>空白が認識されずエラーが出てしまいます。 >どうすれば空白を認識してくれるのでしょうか? 「空白認識」云々ではありません。正しく「実行文」ができていないと思います。 コンパイル時に、しょっぱなの gets( mess ); で「警告」が出ませんでしたか。 http://www.bohyoh.com/CandCPP/C/Library/gets.html には、 「・・・、s が指す配列に格納する」とあるのに、 ★ mess は、どの配列(実体)も指していませんよね。 残る「誤り」については、ソース(BorlandC++5.6.4)を観て下さい。 http://www.bohyoh.com/CandCPP/C/Library/strtok.html -------------------------------------------------------- #include<stdio.h> #include<string.h> void main() { int nn = 0, i; char *mess, *flag; // この時点では双方共に実体がない char cWord[256], tmess[50][32]; // 「実体」の宣言 mess = cWord; // 配列実体を指定(他に「実体確保」という方法も) gets( mess ); printf( "入力:%s\n\n", mess ); while( NULL != ( flag = strtok( mess, " \n" ) ) ){ // 空白 + (Enter) strcpy( tmess[ nn++ ], flag ); mess = NULL; } for( i = 0; i < nn; i++ ) printf( "tmess[%d] %s\n", i, tmess[ i ] ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。
その他の回答 (1)
- aigaion
- ベストアンサー率47% (287/608)
プログラムの流れ方的には合っていると思いますが 処理の仕方やら型がいろいろと間違っていますね。 flagはchar *型では?strtokの戻り値はchar *型ですよ。 gets(mess)で、messに読み込んでいますがmessはchar *型で実態のないただのポインタですよ。 tmess[i]=flagでポインタの付け替えしているのは良いですがtmessに実態はないですよ。 あとtmess[i]じゃなくてtmess[n]じゃ? if(flag!=NULL){ while(flag!=NULL){ ですが、ifの方はいらなくないですか? ifの中の式が真でなければwhileの中に入らないのでなくても同じことですよ。 型宣言を書いて置きます。 char tmess[128][32]; char mess[255]; char *flag; 1文が255文字まで、1単語が32文字までで128語を想定しています。 このあたりから頑張って考えてみてください。 ポインタと実態のある配列の違いを意識するとよいかと思います。
お礼
回答ありがとうございます。 mess,flag等を集成したところ、正常な動作が出ました。 空白を認識しなかった、というのではなく、ミスが原因で上手く作動しなかっただけだったんですね。 ポインタがいまいちわからないのが根底にあると思うので、改めて勉強します..
お礼
回答ありがとうございます。 指摘された箇所を直したところ、正しく作動しました。 getsが空白を認識しなかったのではなく、ただしくコンパイルされていなかったことが原因だったのですね.. ただ、tmessの方は配列を実態確保しない方が狙い通りに動いたのですが、その理由が気になります.. とりあえず、ポインタの理解不足というのが大きいと思うので、もう一度勉強しなおします...