Указатель на 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;
}
Объяснение кода листинга программы
- В функции
get_extensionиспользуется функцияstrrchr, которая ищет последний символ в строке. - Если символ '.' найден, то возвращается указатель на следующий символ после '.'
- Если символ '.' не найден, то возвращается
NULL - В функции
mainсоздаются две строки:file_name1иfile_name2 - Для
file_name1вызывается функцияget_extensionи сохраняется результат в переменнуюextension - Выводится имя файла
file_name1и его расширение, сохраненное вextension - Для
file_name2вызывается функцияget_extensionи сохраняется результат в переменнуюextension - Выводится имя файла
file_name2и его расширение, сохраненное вextension - Возвращается 0, что означает успешный конец работы программы.