2

unsigned long longコマンドラインからの入力として数値のリストを受け入れる C プログラムを作成しています。それらを解析して配列に格納するにはどうすればよいですか? 参考になりそうだstrtoullけど、どうやって使うの?

これが私のコードです:

#include<stdio.h>

main (int argc, char *argv[])
{
  unsigned long long M[1000];
  int i;
  printf("length: %d\n", argc - 1);
  for(i = 1; i < argc; i++) {
    M[i] = strtoull(argv[i], NULL, 10);
    printf("%llu\n", M[i]);
  }
  return 0;
}

パラメータが小さい場合は機能しますが、巨大な数 (たとえば、123456789012345) を入力すると、正しく解析されません。私は何を間違っていますか?

4

3 に答える 3

4

簡単な方法は、argv[i] で sscanf() を %llu とともに使用して、符号なし long long 整数を解析することです。サンプルコードは次のとおりです。

#include <stdio.h>

int main(int argc, char *argv[]) {
    unsigned long long example;
    int i;
    for (i = 1; i < argc; i++) {
        sscanf(argv[i], "%llu", &example);
        printf("Argument: %llu\n", example);
    }
    return 0;
}

strtoull も使用できます。実際、 scanf() は内部で使用していると思います。ただし、オーバーフローに注意してください。scanf() は、適切な場合に errno を設定するとあまり適切に動作しません。私はそれにいくつかの問題がありました。しかし、unsigned long long は冷静に扱う必要があります。オーバーフローを引き起こすには、非常に大きな数が必要です。

于 2013-10-05T17:15:33.680 に答える
3

はい、ご利用いただけますstrtoull。フレームワークの例を次に示します。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
// include other headers as needed...


int main( int argc, char *argv[] )
{
    int i;
    unsigned long long big_value;

    // If there are no command line parameters, complain and exit
    //
    if ( argc < 2 )
    {
        fprintf( stderr, "Usage: %s some_numeric_parameters\n", argv[0] );
        return 1;
    }

    for ( i = 1; i < argc; i++ )
    {
        big_value = strtoull( argv[i], NULL, 10 );

        if ( errno )
        {
            fprintf( stderr, "%s: parameter %s: %s\n", argv[0], argv[i], strerror(errno) );
            return 2;
        }

        // Do some stuff with big_value

        ...
    }

    return 0;
}
于 2013-10-05T17:15:07.893 に答える