今入力した文字列の長さを求めて、それの2倍の幅のフィールドに読み込んだ文字列をプリントするプログラムを作ってます。
文字列の長さを求めるのは%nではできないので他に何を使えばいいか分からないです。
あとフィールド幅ですけど、2倍にするには文字列の長さを求めてそれの倍になるように計算すればいいですか?
string.h の strlen関数を使えば、文字列長が取得できます。
自力で文字列の終端('\0')を探してカウントする方法もありますけど。
これでやってるんですけど
char *input;
scanf("%s", input);
strlen("input");
printf("%s\n", input);
エラーが出てしまいます。
> char *input;
> scanf("%s", input);
ポインタの理解が足りないようですね。
ポインタとはどこかの領域を指し示すものです。
char* input;
とすると、input と領域が結びついていません。
(初期化していないので変な値が入っていて、その指し示す領域が正しいかどうか保障されていな状態)
普通は
char str[ 20 ];
char* input = str;
のようにinputはchar型配列strの領域を指しているという風にしないといけません。
もっとも、
char str[ 20 ];
scanf( "%s", str );
で文字列が取得できますが。
scanfを使う以上固定の領域のchar型配列が必要になります。
何文字の文字列を入力されるか分からない以上、ぴったしの領域に入れさせることは不可能です。
ついでに、
> strlen("input");
は文字列 input の文字列長 すなわち 必ず 5になります。
サンプル)
#include <string.h>
#include <stdio.h>
int main( void )
{
char input[ 64 ]; /* 最大63文字入力できる */
int len;
scanf( "%s", input );
len = strlen( input );
printf( "%sの文字数は%dです。\n", input, len );
return 0;
}
初期値を設定してプリントすればエラーは起きないですけど、
入力に変えるとエラーが起きます。
scanfで入力するのがまずいですか?
ありがとうございます!
2倍のフィールド幅に読み込むにはどうすればいいですか?
例えば
printf("%s\n", len * 2);
にすればいいですか?
> 2倍のフィールド幅に読み込む
の意味が分からないのですが?
これは、課題でしょうか?
出題者にこの意図を聞いてくれませんか?
今テキストの問題をやってます。
入力された文字列の長さを求めて、その2倍の幅のフィールドに読み込んだ文字列をプリントする問題です。
printf文の問題でしょうかね?
> 2倍の幅のフィールド
ってことは、空白埋めのことかな?
printf( "%10s\n", "test" );
とすると、10文字の幅で文字を出力することができます。
10文字に足りない場合は前方に空白が挿入されます。
10文字を超えると10文字以上の幅で出力されます。
printf( "%-10s\n", "test" );
とすると、先ほどと似ているのですが、こちらは後に空白が挿入されます。
詳しくは
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt_format_specification_fields_.2d_.printf_and_wprintf_functions.asp
を参考にしてください。
で、本題ですが、
"%10s\n" の10のところが、文字列長によって2倍にしないといけないことになります。
どうすれば、任意の幅で出力することができるのか。。。
先ほどのサイトの
%[flags] [width] [.precision] [{h |l |I | I32 | I64}]type
の width のリンク先に行ってもらえば何か分かるかもしれません。
printf関数の第一引数の型は何でしょう?
引き渡すフォーマット文字列もしょせんは文字列です。
この文字列を自分で編集できませんか?
編集できれば・・・。
> この文字列を自分で編集できませんか?
おそらくこの手もありますけど、前の質問
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200511/05110031.txt
で、文字数を求めるために %n を使っていることから、printfの
書式指定のところを学習するためのテキストなのではと勝手に解釈しています。
まぁ私も実際使いこなせてないような。。。(汗)
返信がおそくなってすいません。
このテキストで今やってるのは、他に走査文字や入力ストリームです。
今完成しました。
ソースはこんな感じになりました。Blueさん、PATIOさんありがとうございました。
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
char input[100];
int len;
printf("文字を入力してください:");
scanf("%s", input);
/*入力された文字列の長さを求める*/
len = strlen(input);
printf("入力された文字列の長さは %d である\n", len);
printf("この長さの2倍のフィールド幅で表示すると下のようになります\n");
/*%の横に*を入れるとフィールド幅を指定することができる*/
printf("%*s\n", len * 2, input);
return 0;
}
ツイート | ![]() |