2013-11-29 3 views
-1

Я пытаюсь написать функцию на C, чтобы получить расширение файла. Итак, вот мой кодПолучить расширение файла с помощью C

char *getFileNameExtension(char *filename){ 
    char *ext = memchr(filename, '.',strlen(filename)); 
    return ext; 
} 

Он отлично работает. Но когда я пытаюсь проверить для конкретного типа файлов, как текстовых файлов (.txt) Я использую этот код

if (getFileNameExtension(filename)==".txt"){ 
    printf("%s\n",filename); 
} 

Но это не работает. Я пытался напечатать две строки в виде целых чисел, и как строки слишком

printf("%s %s",".txt",getFileNameExtension(txtFile)); 
printf("%d %d",".txt",getFileNameExtension(txtFile)); 

Первый выход нормально и я получаю: .txt .txt, но когда я печатаю их как целые числа (код ASCII я думаю) я получаю этот результат: 27918619 4196714. Кроме того, каждый раз, когда код выполняется, значение int первой строки изменяется (из-за разницы в памяти, я думаю). Может ли кто-нибудь помочь?

+2

Что делать, если имя файла имеет несколько «расширений»? Использовать, например. ['strrchr'] (http://en.cppreference.com/w/cpp/string/byte/strrchr), чтобы получить * последнюю точку. –

+0

@JoachimPileborg Или нет? Я часто использую файлы '.tar.gz' ... –

+0

Кстати, у вас есть неопределенное поведение в ваших вызовах' printf', вы пытаетесь напечатать две строки (или целые), но у вас есть только один аргумент. Кроме того, если вы хотите напечатать указатель, вы должны использовать формат ''% p ''. Печать в виде 'int' даст неправильный результат в 64-битной системе. –

ответ

5

Вы не можете сравнивать строки, как, что, таким образом вы используете это сравнение указателя ...

Это правильная версия:

if (strcmp(getFileNameExtension(filename), ".txt") == 0)

Я предлагаю читать больше C строк.

Кроме того, изюминкой для Googlers:

What if the filename have multiple "extensions"? Use e.g. strrchr to get the last dot. – Joachim Pileborg

+0

Хорошо, спасибо! И что, если я хочу передать строку в другой переменной? – IrishDog

+0

'char extension = getFileNameExtension (filename)' then 'strcmp (extension," .txt ") == 0' это то, что вы имели в виду или? –

+0

Нет, я хочу преобразовать указатель в строку и передать эту строку только в другую переменную типа char – IrishDog

2

Вы сравниваете два указателя, а не две строки. Вместо

getFileNameExtension(filename)==".txt" 

Вы должны проверить:

!strcmp(getFileNameExtension(filename), ".txt") 

Кроме того, вы можете использовать memrchr или strrchr, поэтому имена файлов с (а) периода (ов) возвращает последнюю часть в качестве расширения.

+0

Это тоже было полезно, я попробую ... Спасибо! – IrishDog

+0

Собственно, вы можете предпочесть * не * использовать 'memrchr' (в сочетании с' strlen'), так как 'strrchr' делает это уже правильно. – usr2564301

Смежные вопросы