Мне нужна помощь с getFileExt () в C - PullRequest
1 голос
/ 30 сентября 2010

Я пытаюсь написать получить расширение файла функция в C.

Это то, что у меня есть ...

char *getFileExt(char *filename) {

    char ext[10];

    while (*filename) {
        filename++;
    }

    while (*filename != '.') {
        *(ext++) = *(--filename);               
    }   
    strrev(*ext);       
    return ext;     
}

Я продолжаю получать EXC_BAD_ACCESS на линии внутри петли while.Я новичок с указателями, так что я думаю, что с ними что-то не так.

Почему я не могу присвоить filename значение указателя ext?

Спасибо

Ответы [ 3 ]

5 голосов
/ 30 сентября 2010

Вы никогда не должны возвращать указатель на локальный массив. Данные массива теряются, когда функция теряет область видимости, и указатель будет зависать.

Кроме того, вы не можете изменить значение указателя массива. Вот почему вы получаете ошибку EXC_BAD_ACCESS. Вы можете использовать целочисленный индекс или указатель char *, который указывает на первую запись.

Кстати: есть функция strrchr (см. здесь ), которая дает вам последнее вхождение символа в строку. Вы можете вернуть этот результирующий указатель, поскольку он указывает на правильную позицию в массиве имени файла, которая также действительна вне функции.

2 голосов
/ 30 сентября 2010

Я продолжаю получать EXC_BAD_ACCESS на строке внутри цикла while.

while (*filename != '.') 
{
  *(ext++) = *(--filename);               
} 

выше, вы рассматриваете 'ext' как указатель, однако 'ext' объявляется как массивесли вы хотите использовать указатель, то объявите другой указатель и укажите его в 'ext'

while (*filename) {
  filename++;
}

в приведенном выше цикле while, вы перемещаете указатель 'filename' до тех пор, пока он не попадет в '\ 0', чтохорошо, но вместо этого вы можете начать с конца имени файла, поместив себя в последний '.'вот так:

char *p = filename + strlen( filename ) - 1; // last char

затем двигайтесь вперед

while (*p != '.') --p;

теперь вы p там, где '.'is

теперь копировать из p + 1

strcpy( ext, p + 1 ); 

, когда вы возвращаете, вы не можете вернуть 'ext', потому что он не существует вне тела функции.

способсделать это - либо передать ext в качестве дополнительного аргумента функции, где вы выделяете ext вне функции, либо использовать пространство выделения кучи для расширения

char *getFileExt(char *filename,char *ext)

или даже лучше

char *getFileExt(char *filename,char *ext, size_t maxlen_ext)

или

char *getFileExt(char *filename)
{
   char* ext = malloc( 10 );
...
2 голосов
/ 30 сентября 2010
char* getFileExt(char *filename)
{
    while (*filename) filename++;
    while (*filename != '.') --filename;                 
    return filename;     
}

Или версия без сбоя, если имя файла не содержит .

char* getFileExt(char *filename) 
{
    char* _ext = filename;
    while (*_ext) _ext++;
    while (_ext >= filename && *_ext != '.') --_ext;                
    if (_ext < filename) _ext = NULL;
    return ext;     
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...