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; } |