- ベストアンサー
gccで文字列をトークンで分割する方法
- gccで文字列をトークンで分割する方法を教えてください
- 現在キーボードから入力した文字列内にスペースが入っていた場合、それをトークンして分割したいです
- 同じ方法をキーボードで打ち込んだ文字列でも実行できるようにしたいです
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
マニュアル、読んでますか? ○scanfの動作 ○strtokの動作 ○strcpyの動作 の理解が不十分だと思われます。 scanfのマニュアルの1例です。 http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/scanf.3.html > 変換指定には、以下の 「型修飾子」 を入れることができる。 > s > ホワイトスペースではない文字で構成された文字列に対応する > 文字列の入力は、ホワイトスペースが入力されるか、最大フィールド幅に 達するか、のどちらかが起こると停止される。 %s を使って読み込んだ「ホワイトスペースではない文字で構成された文字列」を、どうやって「ホワイトスペース」で分割するというのでしょう? http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/strtok.3.html > 返り値 > strtok() と strtok_r() は次のトークンへのポインタか、 トークンがなければ NULL を返す。 必ず10回実行しているので、トークンの数がそれより少ないとNULLが返ってきます。 ここでNULLが返ると strcpy(animal[i], strtok(NULL, token)); は strcpy(animal[i], NULL); になります。 この結果が、どうなるかわかりますか?
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
まぁそうなるわなぁ.... その入力に対してどんな動作を期待したの? あと, 質問文の 「実行してみると、 strcpy(animal[0], strtok(zoo, token)); この時にSegmentation fault (core dumped) というエラーが発生してプログラムが停止してしまいます。」 がおかしいことに気づいてる?
お礼
回答頂きありがとうございます。返事送れて申し訳ありません。 現在この問題に関してはrev2335にて次のように解決することができましたのでこの場を借りて報告させて頂きます。 http://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2335/trunk/20140411/menu_show_status.c (プログラム内容) void *menu_show_status(void *param) { char animal[NUM_DATA][LEN_DATA]; char *token=" "; /* 区切り文字はスペースとカンマ */ int i; while(1) { printf("Please type:"); fgets(zoo,sizeof(zoo),stdin); printf("got token results:\n"); token = NULL; strcpy(animal[0], strtok(zoo, " ." )); /* 1度目の呼び出し */ printf("%s\t", animal[0]); for (i = 1; i < NUM_DATA; i++) { /* 2度目以降の呼び出しは */ token = strtok( NULL, " ." ); if(token==NULL) { if(strchr(animal[i-1],'\n')!=NULL) { animal[i-1][strlen(animal[i-1])-1] = '\0'; } break; } strcpy(animal[i],token); /* 最初の引数にNULLを指定 */ printf("%s\t", animal[i]); } --------(中略)------------------------------------------------- } }
- Tacosan
- ベストアンサー率23% (3656/15482)
scanf で読み込んでるんだから, 例えば どのような入力に対してどうなったのか を書いてほしい.
お礼
回答頂きありがとうございます。 現在こちらのソースコードで実際に実行しているのですが、https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2271/trunk/20140411/menu_show_status.c #./menu_show_status まずこれで実行したら Please type: このようにでてきますので、 MONDAY TUESDAY WEDSDAY THRSDAY このようにキーボードで入力したら original: MONDAY と表示され、続けて got token results: Segmentation fault (core dumped) # このように出てプログラムが停止してしまう状態です。
- hashioogi
- ベストアンサー率25% (102/404)
更に私のコンパイラ(VS2008)では <string.h> が必要でした。
お礼
回答頂きありがとうございます。大変申し訳ないです。現在Ubuntuのgccでやっているのですが、string.hが抜けていてもコンパイルは通るような感じです。とりあえず追加しました。 こちらが現在のソースコードとなっております。 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2271/trunk/20140411/menu_show_status.c
- hashioogi
- ベストアンサー率25% (102/404)
よくわからないけど、 少なくとも scanf("%s", &zoo); は scanf("%s", zoo); の間違いです。
お礼
回答頂きありがとうございます。 大変申し訳ありません。間違えました。 scanf("%s", zoo); こちらに直して再コンパイルで実行してみたのですが、Segmentation fault (core dumped) このエラーが発生します。 自分のやりたいことなんですが、プログラム実行後に、コマンドとスペースを置いた第2文字列をオプションのような扱いでコマンドを入力で複数の操作を分岐させるようなものを作りたいと思っています。 どうぞ、引き続き教えて頂きますようお願い致します。
お礼
回答頂きありがとうございます。返事送れて申し訳ありません。 現在この問題に関してはrev2335にて次のように解決することができましたのでこの場を借りて報告させて頂きます。 http://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2335/trunk/20140411/menu_show_status.c やはりポインターのことを自分はちゃんと理解してないなと痛感しました。