teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

訂正追記

2017/02/27 07:25

投稿

otn
otn

スコア86349

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  #include <stdlib.h>
6
6
 
7
7
  int chk_num(char *p){
8
- return strlen(p)==strspn(p,"0123456789");
8
+ return *p && strlen(p)==strspn(p,"0123456789");
9
9
  }
10
10
 
11
11
  void main( int argc, char *argv[] ){
@@ -26,4 +26,29 @@
26
26
 
27
27
  }
28
28
  ```
29
+
29
- なお、質問文のプログラムでは`atof`関数の戻り型が宣言されていないので、`int`と見なされ、期待通りに動作しません。
30
+ なお、質問文のプログラムでは`atof`関数の戻り型が宣言されていないので、`int`と見なされ、期待通りに動作しません。
31
+
32
+ 追記:
33
+ ああ、これだと符号とか小数点、指数を許容しませんね。他の方の回答のように`strtof`を使って、さらに後続文字が無いことを確認すればいいかと。
34
+ ```C
35
+ #include <stdio.h>
36
+ #include <stdlib.h>
37
+
38
+ void main( int argc, char *argv[] ){
39
+ double p,q;
40
+ char *w;
41
+
42
+ p = strtof(argv[1],&w);
43
+ if(argv[1]==w || *w){
44
+ fprintf(stderr,"'%s' is not number\n",argv[1]);
45
+ exit(1);
46
+ }
47
+ q = strtof(argv[2],&w);
48
+ if(argv[2]==w || *w){
49
+ fprintf(stderr,"'%s' is not number\n",argv[2]);
50
+ exit(1);
51
+ }
52
+ }
53
+ ```
54
+ ifの条件は、「数値以外があればエラー」なら`*w`だけでもいいのですが、それだと空文字列(ゼロに変換される)を許容するので、空文字列もエラーにするなら、`argv[1]==w`もしくは`!*argv[1]`の条件も必要です。