回答編集履歴

1

訂正追記

2017/02/27 07:25

投稿

otn
otn

スコア84531

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  int chk_num(char *p){
14
14
 
15
- return strlen(p)==strspn(p,"0123456789");
15
+ return *p && strlen(p)==strspn(p,"0123456789");
16
16
 
17
17
  }
18
18
 
@@ -54,4 +54,56 @@
54
54
 
55
55
  ```
56
56
 
57
+
58
+
57
59
  なお、質問文のプログラムでは`atof`関数の戻り型が宣言されていないので、`int`と見なされ、期待通りに動作しません。
60
+
61
+
62
+
63
+ 追記:
64
+
65
+ ああ、これだと符号とか小数点、指数を許容しませんね。他の方の回答のように`strtof`を使って、さらに後続文字が無いことを確認すればいいかと。
66
+
67
+ ```C
68
+
69
+ #include <stdio.h>
70
+
71
+ #include <stdlib.h>
72
+
73
+
74
+
75
+ void main( int argc, char *argv[] ){
76
+
77
+ double p,q;
78
+
79
+ char *w;
80
+
81
+
82
+
83
+ p = strtof(argv[1],&w);
84
+
85
+ if(argv[1]==w || *w){
86
+
87
+ fprintf(stderr,"'%s' is not number\n",argv[1]);
88
+
89
+ exit(1);
90
+
91
+ }
92
+
93
+ q = strtof(argv[2],&w);
94
+
95
+ if(argv[2]==w || *w){
96
+
97
+ fprintf(stderr,"'%s' is not number\n",argv[2]);
98
+
99
+ exit(1);
100
+
101
+ }
102
+
103
+ }
104
+
105
+ ```
106
+
107
+ ifの条件は、「数値以外があればエラー」なら`*w`だけでもいいのですが、それだと空文字列(ゼロに変換される)を許容するので、空文字列もエラーにするなら、`argv[1]==w`もしくは`!*argv[1]`の条件も必要です。
108
+
109
+