
コマンドライン引数についての質問です。
コマンドライン引数に適当な数字をいれ、金種別にわけるプログラムですが、
コマンドライン引数に負の値や、文字列を入力したときにはエラーが表示させるようにしているのですが、
数字と文字を混合したもののときはエラーが表示されずにそのまま処理されてしまいます。
初めの一文字目が数字だったらそのあとに文字を入れても実行されてしまうようです。
全て数字の場合のみ実行させてそれ以外はエラーメッセージを表示させたいのですが、どのようにすればいいでしょうか?
#include <stdio.h>
#include <stdlib.h>
int syubetu(int money,int *kinsyu);
int *kinsyu;
int main(int argc,char *argv[])
{
int *p,a;
p=(int*)malloc(sizeof(int)*9);
if(p==NULL){
printf("メモリ確保失敗\n");
exit(1);
}
a=atoi(argv[1]);
if(a>0){
syubetu(a,&p[0]);
printf("1万円 %d枚\n",p[0]);
printf("5千円 %d枚\n",p[1]);
printf(" 千円 %d枚\n",p[2]);
printf("5百円 %d枚\n",p[3]);
printf(" 百円 %d枚\n",p[4]);
printf("50円 %d枚\n",p[5]);
printf("10円 %d枚\n",p[6]);
printf(" 5円 %d枚\n",p[7]);
printf(" 1円 %d枚\n",p[8]);
}
else{
printf("入力エラー\n");
exit(1);
}
}
int syubetu(int money,int *kinsyu)
800字以上になるため、処理は省略します。
No.6ベストアンサー
- 回答日時:
#3です。
>それを試したのですが、期待通りの結果になりませんでした。
>う~ん、なぜでしょう。
失礼! タイプミスがあったようです。
以下をコンパイル、実行してみてください。
#include <stdio.h>
#include <stdlib.h>
int isnumstr(char *s)
{
int c;
while(c=*s++){
if((c<'0') || ('9'<c))
return(0);
}
return(1);
}
void main(int argc, char *argv[])
{
int num;
if(argc < 2) {
printf("No args!\n");
exit(1);
}
num = atoi(argv[1]);
printf("argv[1]=[%s], num=[%d]\n", argv[1], num);
if(isnumstr(argv[1]))
printf(" OK!\n");
else
printf(" NG!\n");
}
No.5
- 回答日時:
文字を指定してもエラーにならないのは、atoiの仕様のためです。
atoiは数値として有効なところまでしか、解析せず、エラーも報告しません。
例として、
123A -> 123を返す
1A2 -> 1
A12 -> 0
という具合です。
実際の改善方法は#2さんのやり方に一票ですが、
課題としての扱いなら、自前で数字以外が含まれるかを
判定するのもいいのかも。
蛇足ながら、結果の格納先をmallocしてますが、
プログラム内容を見る限りでは、mallocの必要性はなく、単純に、
int p[9];
...
syubetu(a, &p[0]); /* or syubetu(a, p); */
でOKですよ。
No.4
- 回答日時:
こん**は
atoiを使っているから、aにはint型の値しか入ってきませんね。
a=atoi(argv[1]);
の代わりに、判定プログラムを書けば良いですね。
型宣言はあらかじめしておいてください。
int i ;
if ( argc > 1 ){
a = 0 ;
i = 0 ;
while ( argv[1][i] != '\0' && argv[1][i] >= '0' && argv[1][i] <= '9' && a*10+argv[1][i]-'0' > a ){
a *= 10 ;
a += argv[1][i]-'0' ;
i++ ;
}
if ( argv[1][i] != '\0' ){
printf("入力エラー : ");
if ( argv[1][i] < '0' || argv[1][i] > '9' ){
printf("文字が含まれています。");
} else {
printf("int型を超えています。");
}
exit(1);
}
} else {
printf("引数が足りません");
exit(1);
}
とか、適当なものを作れば良いですね。
がんばってください。
回答ありがとうございます。
前回の処理の部分に引き続きありがとうございます。
えーっと、まずwhileの所は一体なにをやっている処理なのでしょうか?
argv[1][i]なんて初めて見ました。
これはどういう意味なのでしょう???
あとint型を超えるというのはどういう意味でしょうか?
No.3
- 回答日時:
>全て数字の場合のみ実行させてそれ以外はエラーメッセージを表示させたい
それなら、文字列が数字のみかどうかをチェックすればOKです。
具体的には次のような関数を作って呼び出し判定します。
/* 全てが0~9のとき1、それ以外が含まれるとき0を返す */
int isnumstr(cahr *s)
{
int c;
while(c=*s++){
if((c<'0') || ('9'<c))
retuen(0)
}
return(1);
}
No.2
- 回答日時:
atoi より strtol のほうが高機能です。
(詳細は参考 URL)char *endptr;
long x;
x = strtol("123abc", &endptr, 10);
if (*endptr != '\0') {
puts("だめ!");
}
これに加えて,
strtol に渡す文字列が空でないこと,
strtol の戻り値が「LONG_MAX または LONG_MIN」でないこと,
int の範囲に収まっていること,を確認しておけばよいでしょう。
あと,そこまでやるなら,argc のチェックもしておいたほうがいいと思います。
(argc !=2 だったらメッセージを出すとか。)
参考URL:http://www.microsoft.com/japan/msdn/library/defa …
回答ありがとうござます。
なんか授業でならった所までで出来るらしいので
聞いたことの無いstrtolは使わないでおこうと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語 select sort
-
C言語 遺伝的アルゴリズムでの...
-
c言語についての質問です。
-
C言語で10個の数字を読み込んで...
-
C言語 セグメンテーション違反
-
getch / putch用のヘッダ
-
ランプ波形発振器の使用用途
-
GPIBを用いたオシロスコープの...
-
トリガの意味について
-
トンネルの水脈探知
-
デジタル信号処理における収録...
-
音声波形を表示する
-
SNR測定方法の差分法について質...
-
答えについて、なぜ(b-c)に...
-
高校数学について質問です。
-
周波数と角周波数
-
数学の問題です。 (3)④がわか...
-
計算が合いません。
-
クレーンでのCFブレーキとな...
-
ブリッジ整流波形のオシロスコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語プログラミングで初項を1....
-
Expression: nptr != NULL
-
リターンキー又は、スペースキ...
-
プログラムがエラーが出る原因
-
加減剰余のオーバーフローについて
-
C言語教えてください。
-
プログラミングが分かりません。
-
C言語のエラーについて
-
C言語 コンパイルエラー(文字...
-
C言語のソースコードについて教...
-
C言語初心者です。計算がうまく...
-
'printf':識別子が見つかりませ...
-
TCP/IP: 非ソケットに対するソ...
-
doubleからintへのキャスト
-
アセンブリプログラムで特定の...
-
Linux Ubuntu18.04.3でTcoipに...
-
分割コンパイルの手順と方法に...
-
C++ なのですがエラーが消えません
-
コンソールAPIのSetConsoleScre...
-
C言語:2つの複素数(分数)の四...
おすすめ情報