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