C言語関係掲示板

過去ログ

No703 文字列中の単語の個数と文字数を出力

[戻る] [ホームページ]
No.8301

文字列と配列について
投稿者---ジャム(2003/07/12 21:23:18)


アルファベットの文字列を入力(空白文字も含む)し、その中に含まれている単語の個数と文字数を出力するプログラムをつくりたいです。文字列は小文字と空白文字で構成して、単語の区切りは空白文字としたいです。
文字列の入力にはgets()を用いて作りたいと思っているのですが、よく分からなくて頭を抱えてしまっています。お願いします教えてください。
入力 this is a pen
出力  this(4)
 is(2)
  a(1)
  pen(3)
 単語数 3
のように出力したいと思うんですが・・・

No.8302

Re:文字列と配列について
投稿者---nop(2003/07/12 21:41:00)


>アルファベットの文字列を入力(空白文字も含む)し、その中に含まれている単語の個数と文字数を出力するプログラムをつくりたいです。
>文字列は小文字と空白文字で構成して、単語の区切りは空白文字としたいです。

トークン分割なら「strtok()」を使えば簡単に出来るよ。

>文字列の入力にはgets()を用いて作りたいと思っているのですが、

gets() より fgets() を使用することをお薦めします。


例を挙げるとこんな感じかな?

#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>

int main( void )
{
    /* ***** 内部変数定義 ***** */
    char    buf[1024] = { '\0' };
    char    *p;
    int     count;

    do    /* 空文字列入力までループ */
    {
        /* ***** プロンプト表示 ***** */
        printf( "> " );

        /* ***** 文字列入力 ***** */
        fgets( buf, sizeof(buf), stdin );
        ( p=strrchr(buf,'\n') ) ? *p='\0' : 0;    /* 改行除去 */

        if( buf[0] )    /* 入力有り? */
        {
            /* ***** 最初の単語の切り出し ***** */
            count = 0;
            p = strtok( buf, " " );

            while( p )    /* トークンが切り出せなくなるまでループ */
            {
                /* ***** 切り出した単語の表示 ***** */
                printf( "%s(%d)\n", p, strlen(p) );

                /* ***** 単語数カウント ***** */
                count++;

                /* ***** 次の単語の切り出し ***** */
                p = strtok( NULL, " " );
            }
            if( count )    /* 単語は切り出せたか? */
            {
                /* ***** 単語数を表示 ***** */
                printf( "単語数:%d\n", count );
            }
        }
    } while( buf[0] );

    return 0;
}


No.8304

Re:文字列と配列について
投稿者---ジャム(2003/07/12 22:02:26)


まだC言語始めたばかりでよくわかっていなくて bufとプロンプト表示というところ、文字列入力のfgets(buf,sizeof(buf),stdin);
(p=strrchr(buf,'\n'))? *p='\0' : 0; のあたりが理解できないのですが詳しく教えていただけますか? fgets()がよくわかっていないもので

No.8306

Re:文字列と配列について
投稿者---nop(2003/07/12 22:28:54)


>まだC言語始めたばかりでよくわかっていなくて bufとプロンプト表示というところ、

「buf」は入力された文字列を受け取る「char」型の配列変数です。
「プロンプト表示」は「入力を受け付けているよ」と言うことを、
ユーザにわかってもらうために表示している文字列の事です。
実行しても何も表示されなかったら、
入力できるかどうかユーザが迷うでしょ?

>文字列入力のfgets(buf,sizeof(buf),stdin);

fgets()、strtok() 辺りは ANSI C の標準関数なので、
まずは詳細を自分で調べてみて下さい。
サーチエンジンなどで検索すれば、
説明してあるサイトが山ほど出てきますから。

>(p=strrchr(buf,'\n'))? *p='\0' : 0; のあたりが理解できないのですが詳しく教えていただけますか?

「fgets()」により入力されたデータには末尾に「改行文字」が付いたままです。
この「改行文字」('\n')があると処理の過程で問題になることがあるため、
その改行文字を削除しています。
まず、「p=strrchr(buf,'\n')」により、改行文字の位置を取得し、
取得できれば「*p='\0'」によりその改行文字を'\0'に上書きします。
改行が無ければ、p には NULL が入るため「0」の式が評価され、
処理が行われない事になります。


No.8308

Re:文字列と配列について
投稿者---ジャム(2003/07/12 22:43:44)


丁寧に説明していただいてありがとうございました。