2

我正在编写一个 C 程序,它接受unsigned long long从命令行输入的数字列表。如何解析它们并存储在数组中?似乎这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 来解析 unsigned 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 回答
0

请记住,命令行参数都是字符串。如果您需要将 any 转换为数字(整数或实数),请查看以下功能的手册页:

int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);
double atof(const char *nptr);
long int strtol(const char *nptr, char **endptr, int base);
long long int strtoll(const char *nptr, char **endptr, int base);
double strtod(const char *nptr, char **endptr);
float strtof(const char *nptr, char **endptr);
long double strtold(const char *nptr, char **endptr);
于 2018-06-28T12:09:01.400 回答