文字列の問題について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
シンゴ

文字列の問題について

#1

投稿記事 by シンゴ » 17年前

学校でだされた問題でよくわからないところがありやってみてもできないので誰かこの問題をやってみていただけないでしょうか?

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

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関数を使用する。
という問題なんですがよろしくお願いします。

keichan

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

#2

投稿記事 by keichan » 17年前

#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;
}
不明な点があれば何でもどうぞ。

Justy

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

#3

投稿記事 by Justy » 17年前

 ざっと見た感じ、
[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]
 じゃないですか?

keichan

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

#4

投稿記事 by keichan » 17年前

は・・・失礼しました。--;
確かにその通りです。

keichan

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

#5

投稿記事 by keichan » 17年前

追記です。

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

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

シンゴ

文字列の問題について

#6

投稿記事 by シンゴ » 17年前

keichanさんのプログラムを教科書などを見て調べてやってみたら内容はほとんどわかりました。
今度は自分でできるようにもっと勉強をしていきたいと思います。意見をくださった方にはとても感謝してます。ありがとうございました。

シンゴ

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

#7

投稿記事 by シンゴ » 17年前

すいません、わかったつもりだったんですが
token = strtok(buffer, separator);
while( token != NULL ) {
strcpy(word[token_num++], token);
token = strtok(NULL, separator);
のところの意味がいまいち理解できません。教えていただけないでしょうか?

管理人

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

#8

投稿記事 by 管理人 » 17年前

strtok関数は
特定の区切りを指定することで
そこで分割してくれる便利な関数です。
http://www9.plala.or.jp/sgwr-t/lib/strtok.html
この辺参考になります。

シンゴ

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

#9

投稿記事 by シンゴ » 17年前

ありがとうございます。
理解できるまで何回もよんでみます。

管理人

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

#10

投稿記事 by 管理人 » 17年前

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:文字列の問題について

#11

投稿記事 by シンゴ » 17年前

だいたい使い方がわかりました。
親切に教えていただきありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る