Sum int с массивом символов - PullRequest
0 голосов
/ 27 августа 2018

Во время изучения существующего кода я наткнулся на эту строку:

char *s = malloc(SIZE);
scanf("%s", s);
char *y = s + strlen(s);

Если функция scanf() выполнена успешно, что означает добавление целого числа в массив символов?

Я ожидал получить новую строку, содержащую содержимое s и другой символ с целым кодом ASCII (или, по крайней мере, исходной строкой).

При отладке этого кода кажется, что y="" после операции.

Чем объясняется такое поведение?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

strlen(s) находит длину строки, которая также является индексом завершающего символа \0.

Добавление целого числа к указателю находит указатель, который является таким большим количеством элементов в памяти. Поэтому выражение s + strlen(s) добавляет длину s к значению указателя. Это означает, что он вычисляет указатель, который указывает на символ \0.

Эквивалентный способ сделать то же самое, который может быть более кратким, -

char *y = strchr(s, '\0');
0 голосов
/ 27 августа 2018

Вероятно, яснее записать это в форме операции индексации массива, а не в виде арифметики с указателями.

int n;
char* y = s + n;
char* y = &s[n];

Эти две формы эквивалентны. s - это адрес первого элемента в массиве. Добавление одного к нему дает вам адрес следующего элемента в массиве, и так далее. Оба выражения оценивают по адресу n-го элемента в массиве, предполагая, что массив достаточно велик. В этом случае y указывает на нулевой терминатор в конце строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...