こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語に関して

C言語に関して
100までの自然数を文字列に変換したいのですが、以下のプログラムを実行すると、001,002,…010,…099,100のようになってしまいます。左詰めにしたいのですが、どこが間違っているかご教示下さい。

#include <stdio.h>

#define N1 100
#define N2 5

int get_ketasuu();
void henkankun();

int main(void) {
int i, dig, x;
int num1 = N1;
int num2 = N2;
int buff1[N1], buff2[N1];
char buff3[N1][N2];

for (i = 0; i < N1; i++) {
x = buff2[i] = buff1[i] = i + 1;
dig = get_ketasuu(x);
henkankun(&buff2[i], &buff3[i], dig);
printf("%s\n", buff3[i]);
}
return 0;
}


int get_ketasuu(x)
int x;
{
int dig;

dig = 0;
do {
x /= 10;
dig++;
} while (x > 0);
return dig;
}

void henkankun(x, y, dig)
int *x;
int dig;
char (*y)[N2];
{
int j, k;

switch (dig) {
case 1 : k = 1;
case 2 : k = 10;
case 3 : k = 100;
}
j = 0;
do {
(*y)[j] = (*x / k) + '0';
*x %= k;
k /= 10;
j++;
} while (k > 0);
(*y)[j] = '\0';
}

投稿日時 - 2010-07-07 13:30:14

QNo.6021545

すぐに回答ほしいです

質問者が選んだベストアンサー

breakしないとすべてk=100になります。
switch (dig) {
case 1 : k = 1; break;
case 2 : k = 10; break;
case 3 : k = 100; break;
}
sprintfは使ったらだめなのでしょうか?

投稿日時 - 2010-07-07 13:54:57

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

古い形式のCなのがちょっとあれですが。

とりあえず、間違っているのは、

switch (dig) {
case 1 : k = 1;
case 2 : k = 10;
case 3 : k = 100;
}

です。Cでは、break というのが必要です。

ただ、練習問題としてやっているのでなければ、単純に、

for (i = 0; i < N1; i++) {
buff2[i] = i + 1;
sprintf(buff3[i], "%d", buff2[i]);
printf("%s\n", buff3[i]);
}

で、同じ事ができます。
ついでに、x も buff1 も不要です。
buff3 は、あとで使うために100個の配列がいるとしても、buff2 はおそらく不要です。

for (i = 0; i < N1; i++) {
sprintf(buff3[i], "%d", i + 1);
printf("%s\n", buff3[i]);
}

こうすれば get_ketasuu() も henkankun() も不要と。

投稿日時 - 2010-07-07 13:58:53

あなたにオススメの質問