2016-04-08 40 views
0

この機能の問題点を確認してください。この関数は、文字列が数値かどうかをチェックします。それは(正と負の整数と小数が許可されている)数値の場合は、それが他の1の値を返し、それは私がコードを実行しようとしましたが、出力は常に0文字列が数字であることを確認してください

{int is_valid (char strval[]) 
{ 
int strlen, ascii_code, i; 
int decimal=-1, negative=-1; 

strlen=strlen_safe(strval); 

for (i=0; i<strlen; i++) 
{ 
    ascii_code=(int)strval[i]; 

    if(ascii_code==44) 
     return 0; 
    else if(ascii_code==45) 
    { 
     negative++; 
     if(negative||i!=0) 
      return 0; 
    } 
    else if(ascii_code==46) 
    { 
     decimal++; 
     if(decimal>0) 
      return 0; 
    } 
    else if(ascii_code<48||ascii_code>57) 
     return 0; 
} 
return 1; 
} 
+0

否定的な符号なし整数? – alex

+0

44の特定のチェックはなぜですか? – unwind

+7

'45'のような数字は使用しないでください。' -''をはるかに読みやすくしてください。 stdlib 'strtol'または' strtof'を調べます。 – totoro

答えて

0

を返します0を返しますもし文字列が現在のプラットフォーム(エンコーディングとしてASCIIを使用していない可能性があります)上の数字であることを確認しても問題ありません。strtod()を使用してください。これは、浮動小数点数のフォーマット、および一般ユーザーに非常に良くなることができ、すべての微妙な方法を処理します:

#include <stdlib.h> 

int is_valid_number(const char *s, size_t maxdigits) 
{ 
    char *endp; 

    strtod(s, &endp); 
    const size_t digits = (size_t) (endp - s); 
    return *endp == '\0' && digits <= maxdigits; 
} 

上記は非常に保守的で、それが入ってくる文字列のすべての文字がその一部であることが必要人数、個数、総数。これは、"43 "(末尾のスペースに注意してください)が拒否されることを意味します。それはあなたがintstrval[i]を変換する必要はありません

return endp != s; 
+0

これはやや便利ですが、-1234msdsを入力すると有効と見なされます:o – pusa

+0

@pusa本当にすべきではなく、私はそれをテストしました。 :) '' -1234msds "'は拒否されます。 – unwind

+0

私はバグを見つけました。出来た! :Dありがとう! :D – pusa

0

に最終行を変更し、ちょうどプレフィックスを受け入れるようにするに

'-'が文字列の先頭に表示されない場合でも、数字として文字列を引き受けます。

strlen_safeが独自の関数である場合、コードが失敗する可能性があります。

このコードは機能するはずです。

int is_valid (char strval[]) 
{ 
    if(!*strval) 
     return 0; 
    if(*strval=='-') 
     strval++; 
    char decimal=0; 
    while(*strval) 
    { 
     if(!isdigit(*strval)) 
     { 
      if(*strval=='.') 
      { 
       if(decimal) 
        return 0; 
       decimal=1; 
      } 
      else 
       return 0; 
     } 
     strval++; 
    } 
    return 1; 
} 
+0

@ v78dpo4関数は常に0を返します。< – pusa

+0

@pusa試しました。出来た。どのようにあなたの文字列を取得していますか?おそらく、文字列を取得する方法に問題があります。 – v7d8dpo4

関連する問題