比较字符串到某种模式

时间:2015-11-11 13:10:48

标签: c

#1

如何检查文件是否属于某种类型?

我试图这样做:

if(strcmp(filename, "*.txt") == 0){
    // do something
{

但不幸的是,这不起作用。

#2

我知道我不能在strcmp中使用 * 。 那么如何将我的字符串与特定模式进行比较呢?

例如:

if filename is ***.***.txt
do something

4 个答案:

答案 0 :(得分:2)

你可以试试这个。

int len = strlen(filename);
if (len < 4) {
   printf("Filename too short\n");
   exit(1);
}
const char *extension = &filename[len-4];
if strcmp(extension, ".txt") == 0

答案 1 :(得分:2)

您可以使用strrchr搜索.的最后一次出现。如果找到,请针对完全字符串.txt进行测试:

ptr = strrchr (filename, '.');
if (ptr && strcmp(ptr, ".txt") == 0) {
    // do something

如果完整路径的文件名部分不包含扩展名但整个路径都没有(然后strcmp不返回0),或者没有,那么这甚至会失败在整个路径中完全停止(然后strrchr返回NULL)。

我更喜欢这种方法而不是手动计算扩展的长度,因为它可以在不调整文件扩展名的任何长度的情况下工作。

请注意,strcmp严格区分大小写。如果您的本地图书馆有stricmpstrcasecmp,那么这可能是一个更安全的选择。 (stricmp仅限Microsoft,strcasecmp更为标准Posix equivalent。)

答案 2 :(得分:1)

我会使用sscanf()。像这样:

int length = 0;
sscanf( string, "%*[^ \n\r\t.].txt%n", &length );
if ( length >= 4 )
{
   do_something();
}

空格字符列表可能不完整,但可能适合您。

答案 3 :(得分:0)

有一个功能完全符合您的要求,没有任何技巧。 它被称为fnmatch

用法示例:

int check_if_text( char *file_name ) 
{
    char *file_pattern = "*.txt";

    if ( fnmatch( file_pattern, file_name, 0 ) == 0 ) {
        return EXIT_SUCCESS;
    }
    return EXIT_FAILURE;
}

要使用此功能,您需要#include <fnmatch.h>