Указатель на const массив изменяет его? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Привет! Задача была написать функцию, сохраняющую расширение файла из строки file_name в строку extension. Строка file_name задана как const, но получается что данная функция стирает ее содержимое, а строка extension выводит 6 символов, хотя ее размер задан 3 символа? Подскажите, что я сделал неправильно?
#include <stdio.h>
#include <string.h>
 
#define N 3
 
void get_extension(const char *file_name, char *extension);
 
int main ()
{
    char file_name[] = "memo.txt123";
    char extension[N] = "";
    get_extension(file_name, extension);
    
    return 0;
}
 
void get_extension(const char *file_name, char *extension)
{
    size_t i = strlen(file_name);
    
    for(; file_name[i] != '.'; i--)
        *(extension + (i - 5)) = file_name[i];
       
    printf("\nFile extension is: %s\n", extension);
    printf("\nFile name is: %s\n", file_name);
}

Решение задачи: «Указатель на const массив изменяет его?»

textual
Листинг программы
char const* get_extension(char const* file_name)
{
    char const* p = strrchr(file_name, '.');
    return (p ? ++p : NULL);
}
 
int main()
{
    char file_name1[] = "memo.txt123";
    char file_name2[] = "memo";
    char const* extension = get_extension(file_name1);
    printf("\nFile name is: %s\n", file_name1);
    printf("\nFile extension is: %s\n", extension);
 
    extension = get_extension(file_name2);
    printf("\nFile name is: %s\n", file_name2);
    printf("\nFile extension is: %s\n", extension);
 
    return 0;
}

Объяснение кода листинга программы

  1. В функции get_extension используется функция strrchr, которая ищет последний символ в строке.
  2. Если символ '.' найден, то возвращается указатель на следующий символ после '.'
  3. Если символ '.' не найден, то возвращается NULL
  4. В функции main создаются две строки: file_name1 и file_name2
  5. Для file_name1 вызывается функция get_extension и сохраняется результат в переменную extension
  6. Выводится имя файла file_name1 и его расширение, сохраненное в extension
  7. Для file_name2 вызывается функция get_extension и сохраняется результат в переменную extension
  8. Выводится имя файла file_name2 и его расширение, сохраненное в extension
  9. Возвращается 0, что означает успешный конец работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы