4

大学では、コマンドライン引数から入力された文字列が整数であるかどうかをプログラムが検出するかどうかを尋ねられましたが、そうではありませんでした( ./Program 3.7)。今、私はこれをどのように検出できるのか疑問に思っています。そのためa、atoi が検出した例のような入力は無効ですが、たとえばのような入力は無効である3.6必要がありますが、atoi はこれを整数に変換します。

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc > 1) {
        int number = atoi(argv[1]);
        printf("okay\n");
    }
}

しかし、もちろん、argv[1] が実際に整数である場合にのみ、ok を出力する必要があります。私の質問が明確であることを願っています。どうもありがとう。

4

4 に答える 4

11

strtolを見てください。

endptr が NULL でない場合、strtol() は最初の無効な文字のアドレスを *endptr に格納します。ただし、数字がまったくない場合、strtol() は str の元の値を *endptr に格納します。(したがって、\0' but **endptr is リターン時に *str が \0' でない場合、文字列全体が有効でした。)

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  if (argc > 1) {
    char* end;
    long number = strtol(argv[1], &end, 0);
    if (*end == '\0')
      printf("okay\n");
  }
}
于 2010-01-08T00:15:32.367 に答える
2

コードでそれを行う方法を知りたいと仮定すると (実際に宿題である場合は可能です)、1 つの方法は、文字列に関して整数を構成するものを考えることです。おそらく次のようになります。

  • オプションの記号、+/-。
  • 必須の数字。
  • 任意の桁数 (ただし、オーバーフローに注意してください)。
  • 文字列の終わり。

その仕様から、作業を行う関数を作成できます。

この疑似コードのようなものは良い出発点です:

set sign to +1.
set gotdigit to false.
set accumulator to 0.
set index to 0.
if char[index] is '+':
    set index to index + 1.
else:
    if char[index] is '-':
        set sign to -1.
        set index to index + 1.
while char[index] not end-of-string:
    if char[index] not numeric:
        return error.
    set accumulator to accumulator * 10 + numeric value of char[index].
    catch overflow here and return error.
    set index to index + 1.
    set gotdigit to true.
if not gotdigit:
    return error.
return sign * accumulator.
于 2010-01-08T00:16:18.387 に答える
1
int okay = argc>1 && *argv[1];
char* p = argv[1];
int sign = 1;
int value = 0;
if( *p=='-' ) p++, sign=-1;
else if( *p=='+' ) p++;
for( ; *p; p++ ) {
    if( *p>='0' && *p<='9' ) {
        value = 10*value + *p-'0';
    } else {
        okay = 0;
        break;
    }
}
if( okay ) {
    value *= sign;
    printf( "okay, value=%d\n", value );
}

編集: - および + 文字を許可する

これを密集した 1 行または 2 行に圧縮することもできます。または、同じ機能を持つライブラリ関数を見つけることができます;)

EDIT2:楽しみのために-番号を解析する必要があります

于 2010-01-08T00:17:48.693 に答える
1

したがって、最良の選択はstrtof() http://publib.boulder.ibm.com/infocenter/zos/v1r10/topic/com.ibm.zos.r10.bpxbd00/strtof.htmです

于 2010-01-08T00:23:05.627 に答える