フィールド幅

解決


int型  2005-11-17 23:08:47  No: 59653

今入力した文字列の長さを求めて、それの2倍の幅のフィールドに読み込んだ文字列をプリントするプログラムを作ってます。
文字列の長さを求めるのは%nではできないので他に何を使えばいいか分からないです。
あとフィールド幅ですけど、2倍にするには文字列の長さを求めてそれの倍になるように計算すればいいですか?


Blue  2005-11-17 23:11:59  No: 59654

string.h の strlen関数を使えば、文字列長が取得できます。
自力で文字列の終端('\0')を探してカウントする方法もありますけど。


int型  2005-11-17 23:32:01  No: 59655

これでやってるんですけど
  char *input;
  
  scanf("%s", input);
  strlen("input");
  printf("%s\n", input);
エラーが出てしまいます。


Blue  2005-11-17 23:41:12  No: 59656

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


int型  2005-11-17 23:42:03  No: 59657

初期値を設定してプリントすればエラーは起きないですけど、
入力に変えるとエラーが起きます。
scanfで入力するのがまずいですか?


int型  2005-11-17 23:50:35  No: 59658

ありがとうございます!
2倍のフィールド幅に読み込むにはどうすればいいですか?
例えば
printf("%s\n", len * 2);
にすればいいですか?


Blue  2005-11-17 23:53:30  No: 59659

> 2倍のフィールド幅に読み込む
の意味が分からないのですが?
これは、課題でしょうか?
出題者にこの意図を聞いてくれませんか?


int型  2005-11-17 23:56:40  No: 59660

今テキストの問題をやってます。
入力された文字列の長さを求めて、その2倍の幅のフィールドに読み込んだ文字列をプリントする問題です。


Blue  2005-11-18 00:08:10  No: 59661

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 のリンク先に行ってもらえば何か分かるかもしれません。


PATIO  2005-11-18 00:40:27  No: 59662

printf関数の第一引数の型は何でしょう?
引き渡すフォーマット文字列もしょせんは文字列です。
この文字列を自分で編集できませんか?
編集できれば・・・。


Blue  2005-11-18 00:50:45  No: 59663

> この文字列を自分で編集できませんか?
おそらくこの手もありますけど、前の質問
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200511/05110031.txt
で、文字数を求めるために %n を使っていることから、printfの
書式指定のところを学習するためのテキストなのではと勝手に解釈しています。

まぁ私も実際使いこなせてないような。。。(汗)


int型  2005-11-18 19:15:47  No: 59664

返信がおそくなってすいません。
このテキストで今やってるのは、他に走査文字や入力ストリームです。


int型  2005-11-18 19:29:21  No: 59665

今完成しました。
ソースはこんな感じになりました。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;
}


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加