Пытается использовать strtol() в c, но он работает только для первого аргумента
Я просто пытаюсь поместить 4 аргумента командной строки в 4 int. Это работает для первого аргумента, но возвращает 0 для остальных, я не могу видеть, что я делаю неправильно.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
char* pEnd;
long li1, li2, li3, li4;
li1 = strtol(argv[1],&pEnd,10);
li2 = strtol(pEnd,&pEnd,10);
li3 = strtol(pEnd,&pEnd,10);
li4 = strtol(pEnd,NULL,10);
Например, если я запускаю программу как ./a.out -5 5 3 9
то проанализированные значения -5 0 0 0
,
2 ответа
Вы приводите аргументы -5 5 3 9
, Это означает, что
argv[1]
содержит"-5"
argv[2]
содержит"5"
argv[3]
содержит"3"
argv[4]
содержит"9"
Ты используешь
li1 = strtol(argv[1],&pEnd,10);
и сейчас, li1
содержит -5
а также pEnd
держит ""
пустая строка. Приведенные ниже операторы не выполняются и возвращают 0 как strtol
не удалось извлечь числа из пустой строки pEnd
li2 = strtol(pEnd,&pEnd,10);
li3 = strtol(pEnd,&pEnd,10);
li4 = strtol(pEnd,NULL,10);
Чтобы исправить эту проблему, вы можете использовать
li1 = strtol(argv[1], NULL, 10);
li2 = strtol(argv[2], NULL, 10);
li3 = strtol(argv[3], NULL, 10);
li4 = strtol(argv[4], NULL, 10);
и удалить pEnd
как это необязательно.
Альтернативным способом было бы сделать то, что предложил @BLUEPIXY, то есть заключить аргументы в двойные кавычки, чтобы все -5 5 3 9
) становится единым аргументом и argv[1]
держит "-5 5 3 9"
, Когда вы сделаете это, ваш код будет работать как положено.
Проблема в том, что каждое число передается как один аргумент, так что на самом деле это будет делать то, что вы хотите
long li1, li2, li3, li4;
li1 = strtol(argv[1], &pEnd, 10);
li2 = strtol(argv[2], &pEnd, 10);
li3 = strtol(argv[3], &pEnd, 10);
li4 = strtol(argv[4], &pEnd, 10);
Здесь вы можете проверить pEnd
чтобы гарантировать достоверность входных значений, вместо того, чтобы забывать, что программа может быть вызвана с неправильными входными значениями, и вы не будете знать, почему она не работает, простой
if (*pEnd != '\0')
{
fprintf(stderr, "error: invalid input ... \n");
}
предотвратит много проблем в долгосрочной перспективе.
Пропуск проверки ошибок является одной из наиболее распространенных ошибок, которые очевидны для программистов; возможно, это связано с тем, что в c это утомительно, но это не значит, что в этом нет необходимости.
Если вы хотите, чтобы ваш код работал, то вам нужно сделать 4 числа одним аргументом, чего можно достичь, заключив числа в двойные / одинарные qoutes ""
/''
,