Как сравнить последние n символов строки с другой строкой в ​​C - PullRequest
6 голосов
/ 14 марта 2011

Представьте, что у меня есть две строки, одна из которых является URL-адресом типа "/sdcard/test.avi", а другая - "/sdcard/test.mkv".Я хочу написать оператор if, который смотрит, является ли последние четыре символа строки ".avi" или нет в C. Как я могу это сделать?Использование strcmp или что и как?

Ответы [ 6 ]

21 голосов
/ 14 марта 2011

Если у вас есть массив указателей на символы, str, то это:

int len = strlen(str);
const char *last_four = &str[len-4];

даст вам указатель на последние четыре символа строки.Затем вы можете использовать strcmp().Обратите внимание, что вам нужно справиться со случаем, когда (len < 4), и в этом случае вышеупомянутое не будет действительным.

1 голос
/ 28 февраля 2017

Как насчет этого ...

if (!strcmp(strrchr(str, '\0') - 4, ".avi")){
    //The String ends with ".avi"
}

char *strrchr(const char *str, int c) - Возвращает указатель на последний соответствующий символ, найденный в строке, включая символ NULL, если вы укажете это.В этом случае я использую его, чтобы получить указатель на конец строки, а затем перемещаю указатель на 4 шага назад, таким образом давая указатель на последние 4 символа строки.

Затем я сравниваюпоследние 4 символа в ".avi" и, если они совпадают, strcmp возвращает 0 или логическое значение FALSE, которое я инвертирую в своем условии if.

1 голос
/ 14 марта 2011

Просто выполните if ( strcmp(str1+strlen(str1)-4, str2+strlen(str2)-4) == 0 ) {}.

Убедитесь, что длина обеих строк не менее 4 символов.

1 голос
/ 14 марта 2011

В чистом C вы можете прибегнуть только к ручному сравнению:

int endswith(const char* withwhat, const char* what)
{
    int l1 = strlen(withwhat);
    int l2 = strlen(what);
    if (l1 > l2)
        return 0;

    return strcmp(withwhat, what + (l2 - l1)) == 0;
}
0 голосов
/ 15 июня 2011
#include <dirent.h>
#include <string.h>

int main(void)
{
    DIR *dir;
    struct dirent *ent;
    char files[100][500];
    int i = 0;

    memset(files, 0, 100*500);
    dir = opendir ("/sdcard/");
    if (dir != NULL)
    {
        /* Print all the files and directories within directory */
        while ((ent = readdir (dir)) != NULL)
        {
            strcpy(files[i], ent->d_name);
            if(strstr(files[i], ".avi") != NULL)
            {
                printf("\n files[%d] : %s is valid app file\n", i, files[i]);
                i++;
            }
        }
        closedir (dir);
    }
    return 0;
}
0 голосов
/ 14 марта 2011

Вот общая функция для проверки:

int EndsWithTail(char *url, char* tail)
{
    if (strlen(tail) > strlen(url))
        return 0;

    int len = strlen(url);

    if (strcmp(&url[len-strlen(tail)],tail) == 0)
        return 1;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...