C言語関係掲示板

過去ログ

No.329.単語をまたがらず改行する

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

改行!!('')?
投稿者---奈緒(2002/07/13 14:45:23)


一行60文字で英文書かれているのですが、このままでは英単語の中に改行が入り読みにくいのです。読みやすくするc言語を教えてくれませんか 。英単語を分割しないように60文字以内で改行する。あるいは文末ピリオドが現れると改行するプログラムなんですけど。

No.2082

Re:改行!!('')?
投稿者---ともじ(2002/07/15 05:17:23)


おはようございます。

>一行60文字で英文書かれているのですが、このままでは英単語の中に
>改行が入り読みにくいのです。読みやすくするc言語を教えてくれませんか。
>英単語を分割しないように60文字以内で改行する。
>あるいは文末ピリオドが現れると改行するプログラムなんですけど。

さっくりと作ったので条件が漏れているかもしれませんが・・・。
おかしかったら指摘してください。

#include        <stdio.h>
#include        <string.h>
int main(void)
{
        int     c, i;
        char    buf[256], *p;

        i = 0;
        while ((c = getchar()) != EOF) {
                /* 最初がスペースと改行除く */
                if (!(i==0 && c==' ') && c!='\n') {
                        buf[i++] = c;
                }
                /* .で表示 */
                if (c == '.') {
                        buf[i] = '\0';
                        puts(buf);
                        i = 0;          
                }
                /* 60文字以上で表示 */
                else if (i >= 60) {
                        /* 後ろからスペースを探す */
                        p = strrchr(buf, ' ');
                        /* スペースの位置に'\0'を挿入 */
                        *p = '\0';
                        puts(buf);
                        /* 残りの文字を先頭に */
                        strcpy(buf,p+1);
                        i = strlen(buf);
                }
        }
        /* 最終行を表示 */
        buf[i] = '\0';
        puts(buf);


        return( 0 );

}

使い方は
 実行ファイル名 < テキストファイル名
で、画面に整形テキストを表示します。


No.2083

Re:改行!!('')?
投稿者---かずま(2002/07/15 13:06:43)


> さっくりと作ったので条件が漏れているかもしれませんが・・・。
> おかしかったら指摘してください。
        else if (i >= 60) {
                /* 後ろからスペースを探す */
                p = strrchr(buf, ' ');

buf には、まだ '\0' がないので、strrchr は後ろを見つけることが出来ず、へんなところを指す
場合があります。LSI C-86 でコンパイルすると buf[0]〜buf[236] には偶然ゼロが詰まっていて
大丈夫なようですが、Borland C++ でコンパイルすると、結果は文字化けです。

p = strrchr(buf, ' '); の前に buf[i] = '\0'; を挿入してください。

No.2084

訂正
投稿者---ともじ(2002/07/15 14:30:11)


>buf には、まだ '\0' がないので、strrchr は後ろを見つけることが
>出来ず、へんなところを指す場合があります。

ご指摘ありがとうございます。

まだありました。テキストにスペースがないと、NULLに書き込みに
行ってしまいます。
以下、訂正版です。

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

int main(void)
{
        int     c, i;
        char    buf[256], *p;

        i = 0;
        while ((c = getchar()) != EOF) {
                /* 最初がスペースと改行除く */
                if (!(i==0 && c==' ') && c!='\n') {
                        buf[i++] = c;
                }
                /* .で表示 */
                if (c == '.') {
                        buf[i] = '\0';
                        puts(buf);
                        i = 0;          
                }
                /* 60文字以上で表示 */
                else if (i >= 60) {
                        /* 後ろからスペースを探す */
                        buf[i] = '\0';
                        if ((p = strrchr(buf, ' ')) != NULL) {
                                /* スペースの位置に'\0'を挿入 */
                                *p = '\0';
                                puts(buf);
                                /* 残りの文字を先頭に */
                                strcpy(buf,p+1);
                                i = strlen(buf);
                        }
                        /* スペースが無いとき */
                        else {
                                puts(buf);
                                i = 0;
                        }
                }
        }
        /* 最終行を表示 */
        buf[i] = '\0';
        puts(buf);

        return( 0 );
}