У вас много проблем с кодом. Вот некоторые из них:
- Ваша функция возвращает
char
, который является единственным символом. Вам нужно вернуть указатель на массив символов, строку C.
- Вы не выделяете нужный объем памяти. Вы используете
sizeof()
на указателе, который дает размер указателя.
- Вы не сможете, чтобы вызывающий абонент узнал, следует ли освобождать память. Иногда вы куча выделяете, иногда нет. Ваш подход будет протекать.
- Вы передаете
'.palz'
, что является символом буквально, до strrchr
, который ожидает один char
. Что вы хотите передать, это '.'
.
Лучшим подходом является предоставление абоненту памяти. Вот полная программа, которая показывает, как:
#include <string.h>
#include <stdio.h>
void GetNewFileName(const char *fileName, char *newFileName)
{
const char *dot = strrchr(fileName, '.');
if (dot)
{
if (strcmp(dot, ".palz") == 0)
{
size_t len = dot - fileName;
memcpy(newFileName, fileName, len);
newFileName[len] = 0;
return;
}
}
size_t len = strlen(fileName);
memcpy(newFileName, fileName, len);
newFileName[len] = 0;
return;
}
int main(void)
{
char fileName[256];
char newFileName[256];
strcpy(fileName, "foo.bar");
GetNewFileName(fileName, newFileName);
printf("%s %s\n", fileName, newFileName);
strcpy(fileName, "foo.bar.palz");
GetNewFileName(fileName, newFileName);
printf("%s %s\n", fileName, newFileName);
strcpy(fileName, "foo.bar.palz.txt");
GetNewFileName(fileName, newFileName);
printf("%s %s\n", fileName, newFileName);
return 0;
}
Выхода
foo.bar foo.bar
foo.bar.palz foo.bar
foo.bar.palz.txt foo.bar.palz.txt
Обратите внимание, что strcmp
сравнивает чувствителен к строчным и заглавным буквам. В именах файлов Windows нечувствительны к случаю. Я оставлю эту проблему для вас.
Позволяя абоненту выделять память, вы позволяете им выбирать, где выделена память. Они могут использовать локальный стек, назначенный буфером, если захотят. И для вызывающего абонента легко выделять память, потому что новое имя файла никогда не превышает оригинальное имя файла.
Строки представлены «символ *» или «сопзЬ полукокса * "в C. Ваша функция, как написано, возвращает символ" const char "(обратите внимание на отсутствие указателя). –
@JoshPetrie, поэтому я не могу вернуть символ? Я должен вернуть его из ссылки? –
Возвращение 'char' - это всего лишь один символ. – thelaws