現在キーボードから文字列を入力し、その文字列内にスペースが入っていた場合は、それをトークンしてそれぞれの文字列を分けたいと考えています。
そこでトークンに関して次のサイトを見つけました。
http://www1.cts.ne.jp/~clab/hsample/Func/Func08. …
こちらのサイトで紹介されていたサンプルプログラムでzooの中に入っている文字列をトークンして分割する方法で実際やってみたところ、
printfでトークンされた文字列を表示することができることを確認しました。
char zoo[] = "Cat, Dog, Tiger, Bug, Bird, Fish, Seep, Cow, Pig, Rat";
あらかじめ文字列を用意しているやり方を、この文字列をキーボードで打ち込んだ文字列でも同じことができないかと思い
scanf("%s", zoo);
というふうにやってみたところ、コンパイルはできるのですが、
実行してみると、
strcpy(animal[0], strtok(zoo, token));
この時にSegmentation fault (core dumped)
というエラーが発生してプログラムが停止してしまいます。
解決する方法を教えて頂きますよう、お願い致します。
(プログラム内容)
#include <stdio.h>
#define NUM_DATA 10
#define LEN_DATA 20
char zoo[] = "Cat, Dog, Tiger, Bug, Bird, Fish, Seep, Cow, Pig, Rat";
main(void)
{
//char s[100];
//char *s;
char animal[NUM_DATA][LEN_DATA];
char *token = " ,"; /* 区切り文字はスペースとカンマ */
int i;
printf("Please type:");
scanf("%s", &zoo);
printf("original:\t");
printf("%s\n\n", zoo); /* トークンを取り出す文字列を表示 */
printf("got token results:\n");
strcpy(animal[0], strtok(zoo, token)); /* 1度目の呼び出し */
printf("%s\t", animal[0]);
for (i = 1; i < NUM_DATA; i++)
{ /* 2度目以降の呼び出しは */
strcpy(animal[i], strtok(NULL, token)); /* 最初の引数にNULLを指定 */
printf("%s\t", animal[i]);
}
//if (animal[0] == "TOSHIO")
if(strcmp(animal[0],"TOSHIO")==0)
{
printf("TOSHIO you typed. \n");
}
else
{
printf("_%s_typed \n",animal[0]);
}
}
//http://www1.cts.ne.jp/~clab/hsample/Func/Func08. …
No.5ベストアンサー
- 回答日時:
マニュアル、読んでますか?
○scanfの動作
○strtokの動作
○strcpyの動作
の理解が不十分だと思われます。
scanfのマニュアルの1例です。
http://linuxjm.sourceforge.jp/html/LDP_man-pages …
> 変換指定には、以下の 「型修飾子」 を入れることができる。
> s
> ホワイトスペースではない文字で構成された文字列に対応する
> 文字列の入力は、ホワイトスペースが入力されるか、最大フィールド幅に 達するか、のどちらかが起こると停止される。
%s を使って読み込んだ「ホワイトスペースではない文字で構成された文字列」を、どうやって「ホワイトスペース」で分割するというのでしょう?
http://linuxjm.sourceforge.jp/html/LDP_man-pages …
> 返り値
> strtok() と strtok_r() は次のトークンへのポインタか、 トークンがなければ NULL を返す。
必ず10回実行しているので、トークンの数がそれより少ないとNULLが返ってきます。
ここでNULLが返ると
strcpy(animal[i], strtok(NULL, token));
は
strcpy(animal[i], NULL);
になります。
この結果が、どうなるかわかりますか?
回答頂きありがとうございます。返事送れて申し訳ありません。
現在この問題に関してはrev2335にて次のように解決することができましたのでこの場を借りて報告させて頂きます。
http://sourceforge.jp/projects/cc1101driver/scm/ …
やはりポインターのことを自分はちゃんと理解してないなと痛感しました。
No.4
- 回答日時:
まぁそうなるわなぁ....
その入力に対してどんな動作を期待したの?
あと, 質問文の
「実行してみると、
strcpy(animal[0], strtok(zoo, token));
この時にSegmentation fault (core dumped)
というエラーが発生してプログラムが停止してしまいます。」
がおかしいことに気づいてる?
回答頂きありがとうございます。返事送れて申し訳ありません。
現在この問題に関してはrev2335にて次のように解決することができましたのでこの場を借りて報告させて頂きます。
http://sourceforge.jp/projects/cc1101driver/scm/ …
(プログラム内容)
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]);
}
--------(中略)-------------------------------------------------
}
}
No.3
- 回答日時:
scanf で読み込んでるんだから, 例えば
どのような入力に対してどうなったのか
を書いてほしい.
回答頂きありがとうございます。
現在こちらのソースコードで実際に実行しているのですが、https://sourceforge.jp/projects/cc1101driver/scm …
#./menu_show_status
まずこれで実行したら
Please type:
このようにでてきますので、
MONDAY TUESDAY WEDSDAY THRSDAY
このようにキーボードで入力したら
original: MONDAY
と表示され、続けて
got token results:
Segmentation fault (core dumped)
#
このように出てプログラムが停止してしまう状態です。
No.2
- 回答日時:
更に私のコンパイラ(VS2008)では
<string.h>
が必要でした。
回答頂きありがとうございます。大変申し訳ないです。現在Ubuntuのgccでやっているのですが、string.hが抜けていてもコンパイルは通るような感じです。とりあえず追加しました。
こちらが現在のソースコードとなっております。
https://sourceforge.jp/projects/cc1101driver/scm …
No.1
- 回答日時:
よくわからないけど、
少なくとも
scanf("%s", &zoo);
は
scanf("%s", zoo);
の間違いです。
回答頂きありがとうございます。
大変申し訳ありません。間違えました。
scanf("%s", zoo);
こちらに直して再コンパイルで実行してみたのですが、Segmentation fault (core dumped)
このエラーが発生します。
自分のやりたいことなんですが、プログラム実行後に、コマンドとスペースを置いた第2文字列をオプションのような扱いでコマンドを入力で複数の操作を分岐させるようなものを作りたいと思っています。
どうぞ、引き続き教えて頂きますようお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
charと%c , %s の関係について
-
strstrを利用しない文字列検索...
-
C言語で可変長から固定長に変換...
-
ブランクのチェック
-
ファイル入出力
-
(C言語)関数の中で文字列比較で...
-
反転した数値を表示させるやり方
-
c言語
-
C言語 空白の行(改行のみ)が...
-
データ数値を16進文字列でprint...
-
fgetsとsscanfを使って一行から...
-
ある文字列で2回目3回目に出現...
-
2÷3などの余りについて
-
マイナスからプラスへ転じた時...
-
プログラムでの数字につく”f”の...
-
Enterキーを押されたら次の処理...
-
信頼区間の1.96や1.65ってどこ...
-
構文エラー";"が型の前にあり...
-
C言語を実行すると-infが出てき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
C言語 空白の行(改行のみ)が...
-
C言語のステップ数をカウントす...
-
itoaわかりません
-
C言語で16進数文字列から16進数...
-
fgetsで拾われる改行文字を削除...
-
fgets関数を使用したときの文字...
-
文字列中に含まれる文字の個数...
-
charと%c , %s の関係について
-
Cで「大文字、小文字の判定」は...
-
反転した数値を表示させるやり方
-
fgetsとsscanfを使って一行から...
-
スペースで区切って数字を入力
-
小文字のみを数える方法
-
エディットボックスに入力され...
-
CStringについて
-
C言語、単語ごとに改行したい
-
C言語 strlen 再入力を促す
-
教えていただけませんか?C言語...
おすすめ情報