Аргумент функции синтаксического анализа строки 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;
}

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

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

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 следовательно, такая разыменование в этом случае не имеет смысла - хотя, конечно, существуют веские причины для того, чтобы иногда в теле функции разыменовывать указатель, который передается этой функции.

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