Разобрать аргументы командной строки как unsigned long long в C
Я пишу программу на 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), он не анализируется правильно. Что я делаю неправильно?
3 ответа
Простой подход - использовать sscanf() в argv[i] с%llu для разбора длинных целых чисел без знака. Вот пример кода:
#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, вам действительно нужно очень большое число, чтобы вызвать переполнение.
Да, вы можете использовать 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;
}
Просто помните, что аргументы командной строки - это все строки. Если вам нужно преобразовать любое в число (целое или действительное), тогда посмотрите на справочные страницы для следующих функций:
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);