初めての質問で至らない点が多々あると思いますが、宜しくお願い致します。
c言語初心者です。
プログラムは高校専用のサイトを用いて作成しています。
課題の提出期限が迫ってきているため、このサイトで質問させていただきます。
↓以下問題
【c言語 エラー出力について】
下記の問題、
コマンドライン引数に与えられる数値 x といくつかの基数 bi ( 0<i<n, n≧0 ) に対して、その数値 x と、 指定された各基数 bi に対しての xの b
i 進表現を書き出すプログラムを作れ。
x が負であったら、「error」と標準出力に1行として書き出して、直ちにプログラムの実行を終了すること。
2≦bi≦64 となっていない bi に対しては、 その値の十進表現を必要最小限の桁数で1行として標準エラー出力に書き出せ。
上記の問題について、
入力された数値と、その進数を出力するまではプログラムを作れたのですが、2≦bi≦64 となっていない bi に対しては、 その値の十進表現を必要最小限の桁数で1行として標準エラー出力に書き出すというところが作成できません。
出力結果としては、コマンドラインに
12345 -3 4 0 36
と入力された場合、
標準出力に
12345 3000321[4]9IX[36]
と出力され、
(※12345を4進で表現すると300321
12345を36進で表現すると9IX)
標準エラー出力に
-3
0
つまり2進未満、64より上の数値(進数)を与えられた場合、その数値を標準エラー出力に出力したいです。
下記のプログラムに加え、標準エラー出力を書き出すにはどうプログラムを書き換えたら良いのでしょうか?
#include <stdio.h>
#include <stdlib.h>
int show(int value, int base);
int main(int argc, char *argv[]){
if( argc==1 ) return 0;
int x= atoi(argv[1]);
if( x<0 ){ printf("error\n");exit(-1);}
printf("%d", x);
int i;
for(i=2; i!=argc; i++){
int b= atoi(argv);
if( b<2 || b>64 ) continue;
printf(" ");
show(x,b);
printf("[%d]",b);
}
printf("\n");
return 0;
}
void show_(int v,int b,int *n){
char *digit= "0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"+/";
(*n)++;
if( v>=b )show_(v/b,b,n);
putchar(digit[v%b]);
}
int show(int value,int base){
int count=0;
show_(value,base,&count);
return count;
}
c言語 エラー出力について
Re: c言語 エラー出力について
先ほど書いたコードは以下になります。
#include <stdio.h>
#include <stdlib.h>
int show(int value, int base);
int main(int argc, char *argv[]){
if( argc==1 ) return 0;
int x= atoi(argv[1]);
if( x<0 ){ printf("error\n");exit(-1);}
printf("%d", x);
int i;
for(i=2; i!=argc; i++){
int b= atoi(argv);
if( b<2 || b>64 ) continue;
printf(" ");
show(x,b);
printf("[%d]",b);
}
printf("\n");
return 0;
}
void show_(int v,int b,int *n){
char *digit= "0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"+/";
(*n)++;
if( v>=b )show_(v/b,b,n);
putchar(digit[v%b]);
}
int show(int value,int base){
int count=0;
show_(value,base,&count);
return count;
}
Re: c言語 エラー出力について
コンパイラがどんなメッセージを出すか教えてください。
int b= atoi(argv); を
int b = atoi(argv[ i]); と変えるとどうなりますか?
int b= atoi(argv); を
int b = atoi(argv[ i]); と変えるとどうなりますか?
Re: c言語 エラー出力について
申し訳ありません、[ i]を書き忘れていたようです(-_-;)
int b = atoi(argv[ i]);
でエラーメッセージは出ず、コンパイルできます。
この状態でコマンドラインに
12345 -3 4 0 36
と入力すると、標準出力に
12345 3000321[4] 9IX[36]↵
と出力されますが、
-3
0
とエラー出力はされない状態となっています。
int b = atoi(argv[ i]);
でエラーメッセージは出ず、コンパイルできます。
この状態でコマンドラインに
12345 -3 4 0 36
と入力すると、標準出力に
12345 3000321[4] 9IX[36]↵
と出力されますが、
-3
0
とエラー出力はされない状態となっています。
Re: c言語 エラー出力について
int b= atoi(argv); のときに、コンパイルでどんなメッセージがでるか
尋ねているのですが、教えてもらえないのですか?
C言語初心者だそうですが、参考にしているテキストなどのプログラムは
左詰めで書かれているのですか?
尋ねているのですが、教えてもらえないのですか?
C言語初心者だそうですが、参考にしているテキストなどのプログラムは
左詰めで書かれているのですか?
#include <stdio.h>
#include <stdlib.h>
int show(int value, int base);
int main(int argc, char *argv[])
{
if (argc == 1) return 0;
int x = atoi(argv[1]);
if (x < 0) {
printf("error\n");
exit(-1);
}
printf("%d", x);
int i;
for (i = 2; i != argc; i++) {
int b = atoi(argv[i]);
if (b < 2 || b > 64) { // ★
fprintf(stderr, "%d\n", b); // ★
continue; // ★
} // ★
printf(" ");
show(x, b);
printf("[%d]", b);
}
printf("\n");
return 0;
}
void show_(int v, int b, int *n)
{
char *digit = "0123456789" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz" "+/";
(*n)++;
if (v >= b) show_(v / b, b, n);
putchar(digit[v % b]);
}
int show(int value, int base)
{
int count = 0;
show_(value, base, &count);
return count;
}
Re: c言語 エラー出力について
>>かずまさん
int b= atoi(argv); のときにコンパイルすると、下記のようなメッセージがでます。
コンパイルに成功しました(警告あり)
p2-2.c: In function 'main':
p2-2.c:20:1: warning: passing argument 1 of 'atoi' from incompatible pointer type [enabled by default]
int b= atoi(argv);
^
In file included from p2-2.c:2:0:
/usr/include/stdlib.h:147:12: note: expected 'const char *' but argument is of type 'char **'
extern int atoi (const char *__nptr)
また、参考にしているのは高校から配布された資料を参考にしていますが、
プログラムは左詰めで書かれています。
コードありがとうございます!
一度実行してみます!
int b= atoi(argv); のときにコンパイルすると、下記のようなメッセージがでます。
コンパイルに成功しました(警告あり)
p2-2.c: In function 'main':
p2-2.c:20:1: warning: passing argument 1 of 'atoi' from incompatible pointer type [enabled by default]
int b= atoi(argv);
^
In file included from p2-2.c:2:0:
/usr/include/stdlib.h:147:12: note: expected 'const char *' but argument is of type 'char **'
extern int atoi (const char *__nptr)
また、参考にしているのは高校から配布された資料を参考にしていますが、
プログラムは左詰めで書かれています。
コードありがとうございます!
一度実行してみます!
Re: c言語 エラー出力について
@orngmate さん
まさにそうだね
..もっとも数値が 2≦bi≦64 でないという条件をかずまさんが書いてしまったようですが
@かずまさん
[i]がイタリック体の始まりのタグと認められて表示されないというこの掲示板のあるあるですぞ
まさにそうだね
..もっとも数値が 2≦bi≦64 でないという条件をかずまさんが書いてしまったようですが
@かずまさん
[i]がイタリック体の始まりのタグと認められて表示されないというこの掲示板のあるあるですぞ