Странное поведение с функцией strrchr
Я получаю какой-то странный результат с strrchr. Помогите мне, пожалуйста.
Вот мой код:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char szString[32] = "hello-world-and-everyone";
char* ptemp = NULL;
ptemp = strrchr(szString, '-');
if (ptemp == NULL)
{
printf("Invalid string\n");
return 1;
}
printf("%s\n", szString);
printf("%s\n", ptemp );
*ptemp = 0;
printf("%s\n", szString);
return 0;
}
Ожидаемый результат:
hello-world-and-everyone
-everyone
hello-world-and-everyone
Итоговый результат:
hello-world-and-everyone
-everyone
hello-world-and
4 ответа
Фактические результаты верны (что не должно удивлять, на самом деле).
Первые две строки вывода соответствуют вашим ожиданиям, поэтому я предполагаю, что вы их хорошо понимаете. Вот что происходит в последних двух строках: первая строка (присваивание) завершается нулем szString
на позиции последнего тире:
*ptemp = 0; // Replaces the last dash '-' with '\0'
поэтому строка становится
h e l l o - w o r l d - a n d \0 e v e r y o n e \0
Когда вы печатаете это сейчас, printf
находит первый терминатор и останавливается там. Вот почему вы видите усеченную строку в выводе, а не исходную.
strrchr
возвращает указатель на последнее вхождение -
в szString
,
Вот:
*ptemp = 0;
Вы устанавливаете значение, на которое оно указывает 0
(NULL
), заменив -
, Поэтому, когда вы печатаете szString
теперь он заканчивается там, потому что строки завершаются с помощью 0
,
Измените это на:
*ptemp = 65; // ASCII 'A'
И ваш вывод будет:
привет-мир-и-все
-каждый
привет-мир-andAeveryone
Строки в C заканчиваются нулем, что означает символ со значением 0, отмечающий конец строки. Когда ты сделал *ptemp = 0
Вы вставили такой символ в начало найденной строки, которая теперь является концом исходной строки.
Возможно, вы хотели обнулить указатель, выполнив ptemp = 0
(нет *
)?
strrchr
не выделяет и не копирует в новую строку. Он возвращает указатель на существующую строку, где находится данный символ. Итак, когда вы сделали это:
*ptemp = 0;
Вы устанавливаете символ в этом месте в вашей исходной строке в NULL (0). и в итоге:
hello-world-and