ページ 11

文字列の問題について

Posted: 2006年12月04日(月) 13:15
by シンゴ
学校でだされた問題でよくわからないところがありやってみてもできないので誰かこの問題をやってみていただけないでしょうか?

<問題>
実行結果が次のようになるプログラムをつくりなさい。

Please enter a statemant: This is a programming class

Total 5 words. Each word contains;
This: 4 letters.
is: 2 letters.
a: 1 letters.
programming: 11 letters.
class: 5 letters.

ただし、単語数の上限は30、一単語の最大文字数は20と仮定する。
文章入力にはgets関数を使用する。
という問題なんですがよろしくお願いします。

Re:文字列の問題について

Posted: 2006年12月04日(月) 16:13
by keichan
#include <stdio.h>
#include <string.h>

#define MAX_WORD (30)  ///< 最大単語数

#define MAX_LENGTH   (20)      ///< 単語毎の最大文字数

#define BUFFER_SIZE  (1024)        ///< 入力バッファサイズ


int main()
{
    const char separator[/url] = [color=#0000ff">" ,\t\n"[/color];    ///< トークンを分割する文字達

    char word[MAX_WORD][MAX_LENGTH] = {0};  ///< トークン分割後の単語保存領域

    char buffer[BUFFER_SIZE] = {0};   ///< 入力用バッファ

    char* token = NULL;      ///< トークン操作用

    int token_num = 0;            ///< トークン数

    int token_count;                        ///< トークンカウンタ(コンソール出力制御に使用)


    printf("Please enter a statement: ");
    if( gets(buffer) == NULL ) {
        /// エラー発生

        return 1;
    }

    /// トークン分割

    token = strtok(buffer, separator);
    while( token != NULL ) {
        strcpy(word[token_num++], token);
        token = strtok(NULL, separator);
    }

    printf("\nTotal %d words. Each word contains;\n", token_num);
    for( token_count = 0; token_count < token_num; token_count++ ) {
        printf("%s: %d letters.\n", word[token_count], strlen(word[token_count]));
    }
    return 0;
}
不明な点があれば何でもどうぞ。

Re:文字列の問題について

Posted: 2006年12月04日(月) 16:25
by Justy
 ざっと見た感じ、
[color=#d0d0ff" face="monospace]char word[MAX_WORD][MAX_LENGTH] = {0};[/color]
 は
[color=#d0d0ff" face="monospace">char word[MAX_WORD][MAX_LENGTH + 1] = {0};[/color]
 じゃないですか?

Re:文字列の問題について

Posted: 2006年12月04日(月) 16:29
by keichan
は・・・失礼しました。--;
確かにその通りです。

Re:文字列の問題について

Posted: 2006年12月04日(月) 16:50
by keichan
追記です。

#define MAX_LENGTH (20 + 1) ///< 単語毎の最大文字数

こっちの方がいいですね。^^

文字列の問題について

Posted: 2006年12月04日(月) 21:01
by シンゴ
keichanさんのプログラムを教科書などを見て調べてやってみたら内容はほとんどわかりました。
今度は自分でできるようにもっと勉強をしていきたいと思います。意見をくださった方にはとても感謝してます。ありがとうございました。

Re:文字列の問題について

Posted: 2006年12月04日(月) 21:57
by シンゴ
すいません、わかったつもりだったんですが
token = strtok(buffer, separator);
while( token != NULL ) {
strcpy(word[token_num++], token);
token = strtok(NULL, separator);
のところの意味がいまいち理解できません。教えていただけないでしょうか?

Re:文字列の問題について

Posted: 2006年12月04日(月) 22:47
by 管理人
strtok関数は
特定の区切りを指定することで
そこで分割してくれる便利な関数です。
http://www9.plala.or.jp/sgwr-t/lib/strtok.html
この辺参考になります。

Re:文字列の問題について

Posted: 2006年12月04日(月) 22:58
by シンゴ
ありがとうございます。
理解できるまで何回もよんでみます。

Re:文字列の問題について

Posted: 2006年12月04日(月) 23:23
by 管理人
strtok関数の使い方をいかに説明してみました。

strにある文字列を,で区切ってそれぞれの数字を格納しています。
#include <stdio.h>
#include <string.h>

int main(void){
	int i=0;//forで使うi
	char s[5][5],str[/url] = "8,6,7,9,2",*tp;

	tp = strtok( str ,"," );//読み取る文字列はstr。区切るのは「,」

	while (1){
		if ( tp != NULL ){ //最後まで読み取ってなかったら
			strcpy(s,tp);//区切られた区間の文字列をsに格納
			i++;
		}
		else//最後まで読み取られたらブレイク
			break;

		tp = strtok( NULL, "," );//「,」を区切りにして次までのトークンへのポインタを返す

	}

	for(i=0;i<5;i++)
		printf("%s\n",s);

	return 0;
}

Re:文字列の問題について

Posted: 2006年12月05日(火) 13:14
by シンゴ
だいたい使い方がわかりました。
親切に教えていただきありがとうございました。