Странное поведение с функцией 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
Другие вопросы по тегам