アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在キーボードから文字列を入力し、その文字列内にスペースが入っていた場合は、それをトークンしてそれぞれの文字列を分けたいと考えています。

そこでトークンに関して次のサイトを見つけました。

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. …

A 回答 (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);
になります。
この結果が、どうなるかわかりますか?
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。返事送れて申し訳ありません。

現在この問題に関してはrev2335にて次のように解決することができましたのでこの場を借りて報告させて頂きます。

http://sourceforge.jp/projects/cc1101driver/scm/ …


やはりポインターのことを自分はちゃんと理解してないなと痛感しました。

お礼日時:2014/06/14 12:16

まぁそうなるわなぁ....



その入力に対してどんな動作を期待したの?

あと, 質問文の
「実行してみると、
strcpy(animal[0], strtok(zoo, token));

この時にSegmentation fault (core dumped)

というエラーが発生してプログラムが停止してしまいます。」
がおかしいことに気づいてる?
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。返事送れて申し訳ありません。

現在この問題に関しては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]);
}


--------(中略)-------------------------------------------------

}


}

お礼日時:2014/06/14 12:08

scanf で読み込んでるんだから, 例えば


どのような入力に対してどうなったのか
を書いてほしい.
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。

現在こちらのソースコードで実際に実行しているのですが、https://sourceforge.jp/projects/cc1101driver/scm …

#./menu_show_status
まずこれで実行したら

Please type:

このようにでてきますので、

MONDAY TUESDAY WEDSDAY THRSDAY

このようにキーボードで入力したら


original: MONDAY

と表示され、続けて

got token results:
Segmentation fault (core dumped)

#

このように出てプログラムが停止してしまう状態です。

お礼日時:2014/06/06 16:57

更に私のコンパイラ(VS2008)では


<string.h>
が必要でした。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。大変申し訳ないです。現在Ubuntuのgccでやっているのですが、string.hが抜けていてもコンパイルは通るような感じです。とりあえず追加しました。


こちらが現在のソースコードとなっております。
https://sourceforge.jp/projects/cc1101driver/scm …

お礼日時:2014/06/06 16:49

よくわからないけど、


少なくとも
scanf("%s", &zoo);

scanf("%s", zoo);
の間違いです。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。
大変申し訳ありません。間違えました。

scanf("%s", zoo);


こちらに直して再コンパイルで実行してみたのですが、Segmentation fault (core dumped)

このエラーが発生します。


自分のやりたいことなんですが、プログラム実行後に、コマンドとスペースを置いた第2文字列をオプションのような扱いでコマンドを入力で複数の操作を分岐させるようなものを作りたいと思っています。



どうぞ、引き続き教えて頂きますようお願い致します。

お礼日時:2014/06/06 16:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!