こんな感じでチェックするのでしょうか。
C
1#include <stdio.h>
2#include <string.h>
3#include <stdlib.h>
4
5int chk_num(char *p){
6 return *p && strlen(p)==strspn(p,"0123456789");
7}
8
9void main( int argc, char *argv[] ){
10 double p,q;
11
12 if(chk_num(argv[1])){
13 p = atof(argv[1]);
14 }else{
15 fprintf(stderr,"'%s' is not number\n",argv[1]);
16 exit(1);
17 }
18 if(chk_num(argv[2])){
19 q = atof(argv[2]);
20 }else{
21 fprintf(stderr,"'%s' is not number\n",argv[2]);
22 exit(1);
23 }
24
25}
なお、質問文のプログラムではatof
関数の戻り型が宣言されていないので、int
と見なされ、期待通りに動作しません。
追記:
ああ、これだと符号とか小数点、指数を許容しませんね。他の方の回答のようにstrtof
を使って、さらに後続文字が無いことを確認すればいいかと。
C
1#include <stdio.h>
2#include <stdlib.h>
3
4void main( int argc, char *argv[] ){
5 double p,q;
6 char *w;
7
8 p = strtof(argv[1],&w);
9 if(argv[1]==w || *w){
10 fprintf(stderr,"'%s' is not number\n",argv[1]);
11 exit(1);
12 }
13 q = strtof(argv[2],&w);
14 if(argv[2]==w || *w){
15 fprintf(stderr,"'%s' is not number\n",argv[2]);
16 exit(1);
17 }
18}
ifの条件は、「数値以外があればエラー」なら*w
だけでもいいのですが、それだと空文字列(ゼロに変換される)を許容するので、空文字列もエラーにするなら、argv[1]==w
もしくは!*argv[1]
の条件も必要です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。