C Анализ аргумента строковой функции с использованием strtol

Я немного новичок в C и хочу понять кое-что о доступе к аргументам функции с помощью указателей и разыменования.

Вот мой код, весь смысл программы в том, чтобы использовать strtol для анализа заданного параметра только с двумя цифрами, разделенными пробелами.

int sum(const char *input){
  char *input = input_line;   // dereference the address passed into the function to access the string
  int i; // store sum in here
  char *rest; // used as second argument in strtol so that first int can be added to i
  i = strtol(input, &rest, 10); // set first int in string to i
  i += strtol(rest, &rest, 10); // add first and second int
  return i;
}

Я не понимаю, как получить доступ к заданному строковому параметру, потому что строки имеют * по имени переменной, и я не слишком уверен, как это обойти.

В любом случае, спасибо.


person HoopsMcCann    schedule 12.01.2017    source источник
comment
См. Правильное использование strtol() для довольно полного обсуждения того, как правильно использовать strtol(). Однако ваши нынешние проблемы более приземленны. Ваш код не скомпилируется, потому что вы не можете переопределить параметр (input) на верхнем уровне тела функции. Вероятно, вы имели в виду назвать параметр input_line, а не input.   -  person Jonathan Leffler    schedule 12.01.2017


Ответы (1)


Нет необходимости разыменовывать входной параметр. Если вы просто бросите строку

char *input = input_line; 

(что в любом случае не является правильным способом разыменования), код будет работать. Вы передаете sum указатель на char, а именно таким должен быть первый аргумент strol.

Простой тест:

#include <stdio.h>
#include <stdlib.h>

int sum(const char *input){
  int i; // store sum in here
  char *rest; // used as second argument in strtol so that first int can be added to i
  i = strtol(input, &rest, 10); // set first int in string to i
  i += strtol(rest, &rest, 10); // add first and second int
  return i;
}

int main(void){
    char* nums = "23 42";
    printf("%d\n",sum(nums)); 
    return 0;
}

Он печатает 65, как и ожидалось.

Что касается механики разыменования: если по какой-то причине вы действительно хотите разыменовать указатель, переданный sum, вы должны сделать что-то вроде этого (внутри sum):

char ch; // dereferencing a char* yields a char
ch = *input; // * is the dereference operator 

Теперь ch будет содержать первый символ входной строки. Нет никакой причины передавать отдельный char в strol, поэтому такое разыменование в данном случае бессмысленно, хотя, конечно, есть веские причины иногда в теле функции разыменовывать указатель, который передается этой функции.

person John Coleman    schedule 12.01.2017