掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28450

区切りにするには
投稿者---ホセメンドーサ(2006/10/13 11:14:13)


C初心者です。数値をカンマ区切りにするプログラムを作成し躓いています。

下記のようにしたいのですが、
2000⇒2,000
2000000⇒2,000,000
ソースは下記まで考えましたが、肝心のカンマがどうしても思いつきません。
どなたかご伝授ください。

char *test_comma( char *number_str )
{
  int len;
  //まずnumber_strのバイト数を調べる
  len=strlen(number_str);
  //3バイト以上だとカンマを入れる必要がある
  if(len>3)
  {
    //ここの部分が分かりません・・・
  }

  //値返却
  return number_str;
  
}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:区切りにするには 28451 123456789 2006/10/13 12:19:24
<子記事> Re:区切りにするには 28452 123456789 2006/10/13 12:23:20
<子記事> Re:区切りにするには 28453 かずま 2006/10/13 12:36:09


No.28451

Re:区切りにするには
投稿者---123456789(2006/10/13 12:19:24)


フローチャート的には以下のようになります。

str[length-1]で数の底なので、そこから3文字分数える。

4文字目が存在したら、下3文字を一個ずつずらして、カンマを入れる。
1234 → 12234 → 1,234

添え字が0になるまでループ。

ちなみにこの方法なら、最初に3文字以上あるかのifは必要ありません。


この投稿にコメントする

削除パスワード

No.28452

Re:区切りにするには
投稿者---123456789(2006/10/13 12:23:20)


あっと、ちょっと修正。
一文字ずつ見るより、1の位から-3ずつして、0以上ならカンマを挿入、
の方が判断がループ一つですむから効率的かも。


この投稿にコメントする

削除パスワード

No.28453

Re:区切りにするには
投稿者---かずま(2006/10/13 12:36:09)


char *test_comma(char *number_str)
{
    int len = strlen(number_str);
    int pos = len + (len - 1) / 3;
    number_str[pos] = '\0';
    while (len < pos) {
        int i;
        for (i = 0; i < 3; i++)
            number_str[--pos] = number_str[--len];
        number_str[--pos] = ',';
    }
    return number_str;
}



この投稿にコメントする

削除パスワード

No.28586

いまさらなんですが....
投稿者---キユ(2006/10/27 16:53:12)


とっくに解決しているようなんですが、
私も、自分で考えてつくってみようと以下のようなものを作ってみたところ、
うまくいきません。
どうやら、forループに入っていないようなんですが、なんででしょう?
なんだか見当も付きません。

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

char *test_comma(char *number_str);
main (){
    char str[]="20000000";

    puts(str);
    printf("%s\n",test_comma(str));
    
}

char *test_comma( char *number_str )

{
  int i,len,num;
  char out[1024];
  //まずnumber_strのバイト数を調べる
  len=strlen(number_str);
  //3バイト以上だとカンマを入れる必要がある
  if(len>3)
  {
    num=len/3;
    for (i=len+num;i<0;i--){
        //このループに入りません。!
        if(i%3==0){
            out[i]=',';
        }
        else {
        out[i]=number_str[i-num];
        }
    }
    strcpy(number_str,out);
    
  }
  //値返却
  return number_str;
  
}



この投稿にコメントする

削除パスワード

No.28587

Re:いまさらなんですが....
投稿者---Blue(2006/10/27 17:04:24)


あんまりよく見ていませんが
>for (i=len+num;i<0;i--){
の継続条件が逆なのでは?

i の値が 負 であるときループを継続する

となっています。
んで、iがいきなり正の値になるのでループをすぐ抜けるようになっています。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧