Roland M Smith Ответов: 4

Как вы сравниваете правильные символы x в C


Я пишу программу на Windows на обычном языке C с помощью Visual Studio 2017.

У меня есть имя файла в этой переменной:
CHAR szFileName[MAX_PATH];
Мне нужно определить, является ли расширение файла определенным значением. В vbscript это будет что-то вроде этого:

Если правильно(szFilename, 3) = ".txt", то
... сделай что-нибудь здесь ...
Конец, Если

Любые предложения о том, как это сделать в обычном C, будут оценены по достоинству.

Что я уже пробовал:

Я провел несколько поисков в интернете, но так ничего и не нашел.

4 Ответов

Рейтинг:
21

Richard MacCutchan

Не используйте жестко закодированные числа или длины строк, чтобы найти его; самый простой способ-использовать strrchr найти последний символ точки (полной остановки) в имени файла и сравнить полученную подстроку.

char* pszExtension = strrchr(szFileName, '.');
if (pszExtension != NULL && strcmp(pszExtension, ".txt") == 0)
{
    // the extension is .txt
}
else
{
    // not found ...
}


[редактировать]
Обновлено для поиска последней точки. Спасибо, Карло.
[/редактировать]


CPallini

А как насчет ... foo.boo.goo.txt - досье?
:-)

Richard MacCutchan

Спасибо, решение обновлено.

CPallini

Мой 5.

Richard MacCutchan

Спасибо еще раз.

Roland M Smith

Я иду с этим решением, за исключением того, что я использую _stricmp, так что он нечувствителен к регистру.

Richard MacCutchan

Спасибо, и да, stricmp-хороший выбор.

Рейтинг:
2

Shao Voon Wong

Получите длину строки минус на длину строки расширения файла(4) чтобы добраться до последней 4-й позиции и использовать strcmp для сравнения с ".txt" расширение, если результат равен нулю, означает совпадение, иначе оно отличается.

char szFileName[255] = "stories.txt";
if (strcmp(&szFileName[strlen(szFileName) - 4], ".txt") == 0)
    printf("same file extension\n");
else
    printf("different file extension\n");


John R. Shaw

На самом деле твое решение мне нравится больше, чем мое. Но есть одна проблема - не нужно жестко кодировать количество символов в расширении.
Удачное решение:
возвращение (чего strcmp(&ампер;szFileName[функция strlen(szFileName) - функция strlen(szExt), szExt);

CPallini

5.

Рейтинг:
0

John R. Shaw

Просто - просто определите длину строки, хранящейся в szFileName, и выполните поиск в обратном направлении до тех пор, пока вы не оштрафуете'.', а затем сравните это с расширением, которое вы ищете. Другими словами, используйте свой мозг, а не интернет, чтобы решить проблему.

Следующий Старый Стиль C-кода должен сделать трюк:

/* This code has not been compiled - but I would be surprised if is does not work as is. */
int HasExtension(const char* szFileName, const char* szExt)
{
    if ('\0' != *szFileName) /* required to prevent out of range error. */
    {
        int i;
        for( i = strlen(szFileName) - 1; i > 0; --i)
        {
            if ('.' == szFileName[i])
                break;
        }
    }
    return (0 == strcmp(szFileName + i, szExt));
}

Это не единственный способ сделать это в C, но он будет выполнять свою работу.

Посмотрите, сможете ли вы выполнить ту же задачу с помощью цикла while.

Проведите свое исследование. Современная стандартная библиотека C может иметь более новые функции, которые сделают это за вас. Хороший программист на языке Си должен иметь возможность написать стандартную библиотеку с нуля, не используя интернет.

Увидев ответ Шао, я решил добавить это улучшение. Обратите внимание, что это не имеет встроенной защиты от ошибок программиста.
int StringEndsWith(const char* szFileName, const char* szExt)
{
    return (strcmp(&szFileName[strlen(szFileName) - strlen(szExt), szExt) == 0);
}


Рейтинг:
0

MadMyche

Вот учебник по различным строковым методам, который поможет вам в этом
https://www.codingame.com/playgrounds/14213/how-to-play-with-strings-in-c/string-length-string-comparison[^]

И еще один, который, по-видимому, вы могли бы использовать для данного вопроса
Правая Строка – Решение | C Для Чайников Блог[^]