Пытается использовать 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 ""/'',

Другие вопросы по тегам