ページ 1 / 1
C言語で困っています
Posted: 2012年6月03日(日) 14:44
by ネロ
#include<stdio.h>
#include<stdlib.h>
char *printIntWc(int n, char *d,int col);
int main(int argc,char *argv[])
{
int n;
char buf[BUFSIZ];
if(argc == 2){
n = atoi(argv[1]);
printIntWc(n,buf,0);
printf("%d ->%s\n",n,buf);
}else{
fprintf(stderr,"Usage: %s n\n",argv[0]);
}
return 0;
}
char *printIntWc(int n, char *d,int col)
{
if(10 <= n){
d = printIntWc(n/10,d,col++);
}
printf("%d\n",col);
*d++ = n%10+'0';
if((col% 3)== 0){
*d++ = ',';
}
*d = '\0';
return d;
}
3桁ごとに,(カンマ)を挿入してascii変換したいんですがうまく行きません
どうしたら3桁ごとに(カンマ)を入れられますか?
Re: C言語で困っています
Posted: 2012年6月03日(日) 14:55
by softya(ソフト屋)
まず、フォーラムルールをご覧ください。codeタグの利用と宿題の場合は明記をお願いします。
http://dixq.net/board/board.html
codeタグで掲載しました。
コード:
#include<stdio.h>
#include<stdlib.h>
char *printIntWc(int n, char *d,int col);
int main(int argc,char *argv[])
{
int n;
char buf[BUFSIZ];
if(argc == 2){
n = atoi(argv[1]);
printIntWc(n,buf,0);
printf("%d ->%s\n",n,buf);
}else{
fprintf(stderr,"Usage: %s n\n",argv[0]);
}
return 0;
}
char *printIntWc(int n, char *d,int col)
{
if(10 <= n){
d = printIntWc(n/10,d,col++);
}
printf("%d\n",col);
*d++ = n%10+'0';
if((col% 3)== 0){
*d++ = ',';
}
*d = '\0';
return d;
}
Re: C言語で困っています
Posted: 2012年6月03日(日) 14:58
by へにっくす
ある手続き中で再びその手続き自身を呼び出すことを再帰呼出しと言いますが、なぜそれを?
#課題でそうせよと言われた?
と、いうのも普通再帰呼出しして作るものでもない気がしたからですが、、
どうなんでしょう。。
Re: C言語で困っています
Posted: 2012年6月03日(日) 15:07
by softya(ソフト屋)
d = printIntWc(n/10,d,col++);
じゃなく
d = printIntWc(n/10,d,col+1);
だと思います。
col++だと後置インクリメントなので再帰呼び出しされるのはcolの元の値のままです。
ただ、これでも問題あるので後は自分で考えて。
※ そこを理解しないと意味が無いと思いますので。
Re: C言語で困っています
Posted: 2012年6月03日(日) 20:00
by 初級者
こんな感じ
コード:
#include <stdio.h>
void f(int n, int c)
{
if (n) {
f(n / 10, c + 1);
printf("%s%d", ((n / 10) && (c % 3 == 2)) ? "," : "", n % 10);
}
}
int main(void)
{
f(1, 0), putchar('\n');
f(12, 0), putchar('\n');
f(123, 0), putchar('\n');
f(1234, 0), putchar('\n');
f(12345, 0), putchar('\n');
f(123456, 0), putchar('\n');
f(1234567, 0), putchar('\n');
f(12345678, 0), putchar('\n');
f(123456789, 0), putchar('\n');
f(1234567890, 0), putchar('\n');
return 0;
}
Re: C言語で困っています
Posted: 2012年6月04日(月) 00:07
by かずま
ゼロや負の値も表示されるようにしてみました。
良い子は真似をしてはいけない邪悪なプログラムですが。
コード:
#include <stdio.h>
void g(unsigned int n)
{
n>999 ? g(n/1000), printf(",%03u", n%1000) : printf("%u", n);
}
void f(int n) { n<0 ? putchar('-'), g(-n) : g(n); }
int main(void)
{
f(-2147483648), putchar('\n');
f(-1234), putchar('\n');
f(-123), putchar('\n');
f(-12), putchar('\n');
f(-1), putchar('\n');
f(0), putchar('\n');
f(1), putchar('\n');
f(12), putchar('\n');
f(123), putchar('\n');
f(1234), putchar('\n');
f(12345), putchar('\n');
f(123456), putchar('\n');
f(1234567), putchar('\n');
f(12345678), putchar('\n');
f(123456789), putchar('\n');
f(1234567890), putchar('\n');
f(2147483647), putchar('\n');
return 0;
}
Re: C言語で困っています
Posted: 2012年6月04日(月) 00:49
by かずま
失礼しました。直接出力するのではなく、文字列に変換するんですね。
コード:
#include <stdio.h>
char *g(unsigned int n, char *s)
{
return n>999 ? s = g(n/1000, s), s + sprintf(s, ",%03u", n%1000)
: s + sprintf(s, "%u", n);
}
char *f(int n, char *s)
{
return n<0 ? *s++ = '-', g(-n, s) : g(n, s);
}
int main(int argc, char *argv[])
{
if (argc != 2)
fprintf(stderr, "usage: %s n\n", argv[0]);
else {
char buf[20];
int n = atoi(argv[1]);
f(n, buf);
printf("%d -> %s\n", n, buf);
}
return 0;
}