我正在编写一个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)时,它没有被正确解析。我做错了什么?
答案 0 :(得分:3)
一种简单的方法是在带有%llu的argv [i]上使用sscanf()来解析无符号长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表现不佳。我遇到了一些问题。但你应该很冷静,无条件的长期,你真的需要一个非常大的数字来导致溢出。
答案 1 :(得分:2)
是的,您可以使用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;
}
答案 2 :(得分:0)
请记住,命令行参数都是字符串。如果需要将任何数字转换为数字(整数或实数),请查看手册页中的以下功能:
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);