C言語関係掲示板

過去ログ

No.1169 1行の文字数を決めて出力する際に英単語の切れ目を次の行に表示

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

英単語の切れ目について
投稿者---503(2004/07/05 16:26:27)


英文のテキストを読み込んで、1行の文字数を決めて出力する際に英単語の切れ目を次の行に表示するプログラムを作りたいんですけど......。
もし文字数を越えた場合空白を出力すればいいんですか?そこら辺が良くわからないのでヒントください。


No.15241

Re:英単語の切れ目について
投稿者---503(2004/07/05 18:11:13)


>>英文のテキストを読み込んで、1行の文字数を決めて出力する際に英単語の切れ目を次の行に表示するプログラムを作りたいんですけど......。
>>もし文字数を越えた場合空白を出力すればいいんですか?そこら辺が良くわからないのでヒントください。
>
>よく分からないので、表示例を示してください。
表示例って何のですか?


No.15244

Re:英単語の切れ目について
投稿者---ぽこ(2004/07/05 18:37:53)


>表示例って何のですか?

これこれこういう英文があり、1行をN文字とした場合、
以下のように表示される。
・・・

といった例の事だと思いますよ。


No.15242

Re:英単語の切れ目について
投稿者---kng(2004/07/05 18:23:41)


>英文のテキストを読み込んで、1行の文字数を決めて出力する際に英単語の切れ目を
>次の行に表示するプログラムを作りたいんですけど......。
>もし文字数を越えた場合空白を出力すればいいんですか?
次の行に表示というのは改行させたいということですよね?
それならば改行を出力させればいいのでは・・・



No.15245

Re:英単語の切れ目について
投稿者---503(2004/07/05 18:39:37)


>>英文のテキストを読み込んで、1行の文字数を決めて出力する際に英単語の切れ目を
>>次の行に表示するプログラムを作りたいんですけど......。
>>もし文字数を越えた場合空白を出力すればいいんですか?
>次の行に表示というのは改行させたいということですよね?
>それならば改行を出力させればいいのでは・・・
ありがとうございます。言われてみればかなり当たり前のことでした。
切れ目で改行はわかったんですが、切れ目をどうやって判断すれば良いの
でしょうか?


No.15247

Re:英単語の切れ目について
投稿者---REE(2004/07/05 19:39:24)


>>>英文のテキストを読み込んで、1行の文字数を決めて出力する際に英単語の切れ目を
>>>次の行に表示するプログラムを作りたいんですけど......。

これだけでは、以下の様なプログラムにも取れそうですね・・

入力
I have a pen.
This is a pen.

出力
I have a pen.
 ^    ^ ^
This is a pen.
    ^  ^ ^

>切れ目で改行はわかったんですが、切れ目をどうやって判断すれば良いの
>でしょうか?

英単語の切れ目は空白でしょうから、空白があったら切れ目でしょう。
逆に改行したいところに空白が無ければ、前に向かって探すことになりそうですね。




No.15273

Re:英単語の切れ目について
投稿者---ニタチ(2004/07/06 12:15:56)


>英文のテキストを読み込んで、1行の文字数を決めて出力する際に英単語の切れ目を次の行に表示するプログラムを作りたいんですけど......。

 テキストを読み込むサイズの方は決まっていますか??


No.15289

Re:英単語の切れ目について
投稿者---ニタチ(2004/07/06 18:08:35)


制限をかけて作ってみました。
しかもできてるのかもよくわからない・・・(-_-;)

#include <stdio.h>
#include <string.h>
#
#define TEXT_SIZE 1024    /* テキストを読み込む最大のサイズ */
#define LINE_SIZE 20        /* 出力する1行の文字数 */

int input_words(char *text, FILE *fp);
void disp_words(char *text, int length);
void disp_line(char *head, char *rear);

/*-------------------------------------------------------------------------*/
/*        メイン関数                                                 */
/*-------------------------------------------------------------------------*/
int main(void)
{
    FILE *fp;
    char text[TEXT_SIZE] = {'\0'};
    int length;
    
    if( (fp = fopen("text.txt", "r")) == NULL ){
        return 1;
    }
    
    /* テキストを読み込む */
    length = input_words(text, fp);
    
    /* テキストを編集して表示 */
    disp_words(text, length);
    
    return 0;
}
/*-------------------------------------------------------------------------*/
/*        テキストを読み込む(改行は取り除いておく)                   */
/*          戻り値 : 読み込んだ文字数                              */
/*-------------------------------------------------------------------------*/
int input_words(char *text, FILE *fp)
{
    while( fgets(text + strlen(text), TEXT_SIZE - strlen(text), fp) != NULL && 
            strlen(text) < TEXT_SIZE - 1 )
    {
        if( text[strlen(text) - 1] == '\n' ){
            text[strlen(text) - 1] = '\0';
        }
    }
    
    return (int)strlen(text);
}
/*-------------------------------------------------------------------------*/
/*    テキストを編集して表示                                         */
/*-------------------------------------------------------------------------*/
void disp_words(char *text, int length)
{
    char *head = text;
    char *rear;
    
    for( ; head + LINE_SIZE - text < length ; head = rear)
    {
        rear = head + LINE_SIZE;
        
        if( *rear == ' ' ){
            disp_line(head, rear);
        }
        else{
            /* 後方のポインタを空白まで戻す */
            for( ; *rear != ' ' && rear != head ; rear--)
                    ;
            /* 単語長がLINE_SIZE以上だった場合 */
            if( rear == head ){
                rear = head + LINE_SIZE;
                disp_line(head, rear);
            }
            else{
                disp_line(head, rear);
            }
            rear++;
        }

        printf("\n");
    }
    /* 最後の行を表示 */
    disp_line(head, text + length);
}
/*-------------------------------------------------------------------------*/
/*        一行表示                                                   */
/*-------------------------------------------------------------------------*/
void disp_line(char *head, char *rear)
{
    for( ; head < rear ; head++)
    {
        printf("%c", *head);
    }
}




No.15304

Re:英単語の切れ目について
投稿者---かずま(2004/07/06 22:04:29)


どんなプログラムを書けばよいのか、もう少し仕様をはっきりさせてほしいものです。
例えば、単語を区切るスペースが 2個以上あったときは、どうすればよいのか
とか、行の長さより長い単語があった場合、どうすればよいのかとか。

とりあえず、適当に書いてみました。これは、期待通り動きますか?
#include <stdio.h>

void put_line(const char *s, int n)
{
    for (;;) {
        int i, j = -1;
        for (i = 0; ; i++) {
            if (s[i] == '\n' || s[i] == '\0') {
                fputs(s, stdout);
                return;
            }
            if (s[i] == ' ') j = i;
            if (i == n) break;
        }
        printf("%.*s\n", (j < 0) ? i : j, s);
        s += (j < 0) ? i : j+1;
    }
}

int main(void)
{
    char buf[1024];

    while (fgets(buf, sizeof buf, stdin))
        put_line(buf, 20);
    return 0;
}



No.15313

Re:英単語の切れ目について
投稿者---ニタチ(2004/07/07 09:35:01)


み、短いですね〜・・・。しかし、
>1行の文字数を決めて出力する際に英単語の切れ目を次の行に表示する
を満たしていません。
以下のようなテキストを読み込んだ場合、

What about the kids? On a regul
ar basis. It's up to you. How 
would you describe that in Eng
lish?

1行の文字数を20とすると、

What about the kids?
On a regul
ar basis. It's up to
you. How
would you describe
that in Eng
lish?

と、なってしまいます。多分503さんは、

What about the kids?
 On a regular basis.
 It's up to you. How
 would you describe
that in English?

という風にしたいんじゃないかと思います。