c言語 エラー出力について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
orngmate

c言語 エラー出力について

#1

投稿記事 by orngmate » 3ヶ月前

初めての質問で至らない点が多々あると思いますが、宜しくお願い致します。
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;

}

orngmate

Re: c言語 エラー出力について

#2

投稿記事 by orngmate » 3ヶ月前

申し訳ありません、
コードを貼り付ける場合は

コード:

で囲って下さい、という注意書きを見落としていました!

orngmate

Re: c言語 エラー出力について

#3

投稿記事 by orngmate » 3ヶ月前

先ほど書いたコードは以下になります。

コード:

#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言語 エラー出力について

#4

投稿記事 by かずま » 3ヶ月前

コンパイラがどんなメッセージを出すか教えてください。

int b= atoi(argv); を
int b = atoi(argv[ i]); と変えるとどうなりますか?

orngmate

Re: c言語 エラー出力について

#5

投稿記事 by orngmate » 3ヶ月前

申し訳ありません、[ i]を書き忘れていたようです(-_-;)
int b = atoi(argv[ i]);
でエラーメッセージは出ず、コンパイルできます。
この状態でコマンドラインに
12345 -3 4 0 36
と入力すると、標準出力に
12345 3000321[4] 9IX[36]↵
と出力されますが、
-3
0
とエラー出力はされない状態となっています。

アバター
かめのこのこのこ
記事: 15
登録日時: 2年前

Re: c言語 エラー出力について

#6

投稿記事 by かめのこのこのこ » 3ヶ月前

標準エラー出力に書き込みたいときは

コード:

    fprintf(stderr, "文字", ...);
が使えます
第1引数に stderr があるほかは printf と同じように第2引数以降を指定します。
ほかにも組み方がわからなくて困っているところがあれば気軽に質問投げてくださいなのです
オフトピック
標準入力から読み込む関数、標準出力に書き込む関数は標準ライブラリにあるのに、標準エラー出力に書き込む専用の関数がない不思議だったりしますが :-)

かずま

Re: c言語 エラー出力について

#7

投稿記事 by かずま » 3ヶ月前

int b= atoi(argv); のときに、コンパイルでどんなメッセージがでるか
尋ねているのですが、教えてもらえないのですか?

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

orngmate

Re: c言語 エラー出力について

#8

投稿記事 by orngmate » 3ヶ月前

>>かめのこのこのこさん
アドバイスありがとうございます!
fprintf(stderr,…);の前には、
もし与えられた数値が2≦bi≦64 となっていないならエラー出力する、といった意味のif文を下記のように付け加えた方が良いのでしょうか…?

コード:

if(2≦bi≦64でないなら){
for( …){
   fprintf(stderr,…);
}exit(-1);
}
説明が下手ですみません…

orngmate

Re: c言語 エラー出力について

#9

投稿記事 by orngmate » 3ヶ月前

>>かずまさん
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)
また、参考にしているのは高校から配布された資料を参考にしていますが、
プログラムは左詰めで書かれています。

コードありがとうございます!
一度実行してみます!

アバター
かめのこのこのこ
記事: 15
登録日時: 2年前

Re: c言語 エラー出力について

#10

投稿記事 by かめのこのこのこ » 3ヶ月前

@orngmate さん
まさにそうだね
..もっとも数値が 2≦bi≦64 でないという条件をかずまさんが書いてしまったようですが

@かずまさん
[​i]がイタリック体の始まりのタグと認められて表示されないというこの掲示板のあるあるですぞ

orngmate

Re: c言語 エラー出力について

#11

投稿記事 by orngmate » 3ヶ月前

かずまさんに教えて頂いたとおりに、

コード:

if (b < 2 || b > 64) {          
			fprintf(stderr, "%d\n", b); 
			continue;                   
		}    

と追加し実行してみると、無事にエラー出力されました!
非常に分かりにくい説明だったにもかかわらず、お付き合いいただいた
かずまさん、 かめのこのこのこさん、
本当にありがとうございました!(^▽^)/

返信

“C言語何でも質問掲示板” へ戻る