C言語関係掲示板

過去ログ

No.1310 文字列を読み込んで1行何文字かで改行表示する

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

文字列の整頓
投稿者---かなみ(2004/10/26 21:26:29)


文字列を読み込んで1行何列かでそろえて出力するプログラムを作りたいのですが、どのようなソースになるのでしょうか?下のように作ってみたのですが・・・どなたか教えてください。

#include <stdio.h>

int main()
{
char a[20];
scanf(" %s", &a);
printf("%s\n", a);
return 0;
}


No.17535

Re:文字列の整頓
投稿者---KING・王(2004/10/26 22:02:56)


>1行何列かでそろえて出力する

というのが、よくわからないのですが、1行に出力する文字数を固定し、
指定行に達したら改行をいれて出力するというのであれば、
以下のようなかんじだと思います。
(この例では、1行5文字で改行します。)

#外していたらごめんなさい。

int main()
{
    char a[20];
    char buf[5+1];//1行分のバッファの確保
    scanf(" %s", &a);
    length = strlen( a );//文字列の長さを計算する
    for( i = 0, j = 0; i < length; i++ ){
        buf[j] = a[i];//1行用バッファにコピー
        if( j == 5 ){// バッファに5文字格納済み
            buf[6] = '\0';
            printf("%s\n", buf );//バッファを表示
            j = 0;//バッファのカウントを0に戻す
        }
    }
    if( j > 0 ){//出力していないバッファのデータを出力する
        buf[j] = '\0';
        printf( "%s\n", buf );
    }
	return 0;
}



No.17536

Re:文字列の整頓
投稿者---かなみ(2004/10/26 22:18:43)


>>1行何列かでそろえて出力する
>
>というのが、よくわからないのですが、1行に出力する文字数を固定し、
>指定行に達したら改行をいれて出力するというのであれば、
>以下のようなかんじだと思います。
>(この例では、1行5文字で改行します。)
>
>#外していたらごめんなさい。

すいません。言葉が間違っていました。適当に文字を入力して(例えば1行5文字で改行と指定して)出力するものを作りたいんです。つまり100文字入力すると5文字ずつ20行の文字列が出力されるようなものです。

コンパイルエラーが出たので少し書き換えてみました。

#include <stdio.h>

int main()
{
  int i,j,length,strlen;
char a[20];
char buf[5+1];//1行分のバッファの確保
scanf(" %s", &a);
length = strlen( a );//文字列の長さを計算する
for( i = 0, j = 0; i < length; i++ ){
buf[j] = a[i];//1行用バッファにコピー
if( j == 5 ){// バッファに5文字格納済み
buf[6] = '\0';
printf("%s\n", buf );//バッファを表示
j = 0;//バッファのカウントを0に戻す
}
}
if( j > 0 ){//出力していないバッファのデータを出力する
buf[j] = '\0';
printf( "%s\n", buf );
}
return 0;
}

しかし、まだ「関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。」
とエラーが出ます。どうしたらいいのでしょうか?



No.17541

Re:文字列の整頓
投稿者---RAPT(2004/10/26 23:31:58)


strlen()関数を使うには、#include <string.h>が必要。



No.17561

Re:文字列の整頓
投稿者---かなみ(2004/10/27 13:35:06)


><pre>strlen()関数を使うには、#include <string.h>が必要。</pre>

ありがとうございます。エラーはなくなったんですが、実行がうまくいきません。



No.17573

Re:文字列の整頓
投稿者---かずま(2004/10/27 22:37:13)


>><pre>strlen()関数を使うには、#include <string.h>が必要。</pre>
>
> ありがとうございます。エラーはなくなったんですが、実行がうまくいきません。

#include <string.h> を追加しても、
「関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。」
というエラーがなくなるはずはありません。

int i, j, length, strlen; を int i, j, length; に変えたら、そのエラーがなくなります。

コンパイラがエラーメッセージを出すときは、ソースのどの行でエラーを検出
したかを示すはずです。だから、length = strlen( a ); の行だということは
すぐに分かるでしょう。

<string.h> を include すると、関数 main の外側では、strlen は関数だと
宣言されます。しかし、関数 main の内側では int strlen; があるので、
その strlen は関数ではなく int です。

関数の strlen は 関数ポインタに変換されますが、
int の strlen は 関数ポインタに変換されません。
だから、関数呼び出し演算子 ( ) を後ろに付けてもだめだということです。

さて、元のプログラムですが、j の値を変更していないことと、
char buf[6]; なので buf[0]〜buf[5] までしか参照してはいけないのに、
buf[6] = '\0'; なんてやっていることがまずいのです。

この間違いを修正した正しいプログラムを【掲示板ご利用上の注意】に
したがって投稿してください。


No.17585

Re:文字列の整頓
投稿者---かなみ(2004/10/28 10:41:11)


>この間違いを修正した正しいプログラムを【掲示板ご利用上の注意】に
>したがって投稿してください。

以下のように直してみましたが、実行がうまくいきません。どこがいけないのでしょうか?
あと、すいませんが字下げの変換ツールを使っても字下げされないみたいです。

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

int main()
{

int i,j,length;
char a[20];
char buf[5+1];
scanf(" %s", &a);
length = strlen(a);

for( i = 0, j = 0; i < length ; i++ ,j++){
buf[j] = a[i];
if( j == 5 ){
buf[5] = '\0';
printf("%s\n", buf );
j = 0;
}
}

if( j > 0 ){
buf[j] = '\0';
printf( "%s\n", buf );
}

return 0;
}


No.17599

Re:文字列の整頓
投稿者---REE(2004/10/28 15:06:48)


>>この間違いを修正した正しいプログラムを【掲示板ご利用上の注意】に
>>したがって投稿してください。
>
>以下のように直してみましたが、実行がうまくいきません。どこがいけないのでしょうか?

うまくいかないときは、どのように期待と違うのかちゃんと書いてください。

>あと、すいませんが字下げの変換ツールを使っても字下げされないみたいです。

それは、使い方を間違えているのでしょう。
本文もソースと同時に変換する必要がありますよ。

ぱっと見 jの初期化がされていないのが気になります。


No.17609

Re:文字列の整頓
投稿者---かなみ(2004/10/28 21:15:11)


実行してみると始めの4列は5文字ずつで改行されているのですが、
そのあとが一文字ずつです。しかも打ち込んだ順番とは違うように並んでいます。

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

int main()
{

int i,j,length;
char a[20];
char buf[5+1];
scanf(" %s", &a);
length = strlen(a);

for( i = 0, j = 0; i < length ; i++ ,j++){
buf[j] = a[i];
if( j == 5 ){
buf[5] = '\0';
printf("%s\n", buf );
j = 0;
}
}

if( j > 0 ){
buf[j] = '\0';
printf( "%s\n", buf );
}

return 0;
}




No.17616

Re:文字列の整頓
投稿者---REE(2004/10/29 10:23:50)


>実行してみると始めの4列は5文字ずつで改行されているのですが、
そのあとが一文字ずつです。しかも打ち込んだ順番とは違うように並んでいます。

>char a[20];

>scanf(" %s", &a);

aには19文字までしか入れられません。
それ以上の部分が、はみ出してメモリを破壊しています。



No.17544

Re:文字列の整頓
投稿者---かずま(2004/10/27 00:01:15)


【掲示板ご利用上の注意】にしたがってプログラムを投稿してください。
字下げのないプログラムは読めません。

と小言を言うだけではなんなので、あまり参考にならないと思われる
プログラムを書いてみました。
#include <stdio.h>

#define N  5

int main(void)
{
    char a[20], *p;

    if (scanf("%19s", a) != 1) return 1;
    for (p = a; *p && printf("%.*s\n", N, p) == N+1; p += N) ;
    return 0;
}