C 将字符串与特定模式进行比较 #1

C 将字符串与特定模式进行比较 #1,c,C,如何检查文件是否属于某一类型 我试着这样做: if(strcmp(filename, "*.txt") == 0){ // do something { int length = 0; sscanf( string, "%*[^ \n\r\t.].txt%n", &length ); if ( length >= 4 ) { do_something(); } 但不幸的是,这不起作用 #2 我知道我不能在strcmp中使用*。 那么,如何将字符串与特定模式进行比

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

我试着这样做:

if(strcmp(filename, "*.txt") == 0){
    // do something
{
int length = 0;
sscanf( string, "%*[^ \n\r\t.].txt%n", &length );
if ( length >= 4 )
{
   do_something();
}
但不幸的是,这不起作用


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

例如:

if filename is ***.***.txt
do something
你可以试试这个

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
int len=strlen(文件名);
if(len<4){
printf(“文件名太短\n”);
出口(1);
}
常量字符*扩展名=&filename[len-4];
如果strcmp(扩展名“.txt”)==0
我会使用
sscanf()
。大概是这样的:

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

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

您可以使用搜索上次出现的
。如果找到,则根据准确的字符串
.txt
进行测试:

ptr = strrchr (filename, '.');
if (ptr && strcmp(ptr, ".txt") == 0) {
    // do something
如果完整路径的文件名部分不包含扩展名,但整个路径包含扩展名(然后
strcmp
不返回
0
),或者整个路径中根本没有句号(然后
strrchr
返回
NULL
),则此操作甚至不会失败

与手动计算扩展名的长度相比,我更喜欢这种方法,因为它不需要调整文件扩展名的任何长度


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

有一个功能,完全满足您的要求,无需任何技巧。 它被称为
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文件。我希望看到const char*扩展名,别忘了检查文件名的长度是否足以使len-4有效。我认为len<4应该会导致与非零strcmp相同的行为。如果您展示如何检查此文件是否成功/匹配,请向上投票。
[]
%n
都不是
*scanf()
的日常功能,初学者可能会感到困惑。(
length>=4
?)实际上,我认为您可以跳过%n,只检查sscanf()的返回值,如果它不为零,它将匹配。返回代码是“成功匹配和分配的输入项目数”
%*[
禁止赋值,
%n
不是一个输入项。选中它,总是返回零,因此
长度>=4
是正确的检查。(实际上,由于
“.txt”
单独不匹配--
%[
匹配1..n,而不是0..n--任何匹配都给出
长度>=5
)啊,糟透了。我想你需要实际阅读一些东西。我怎样才能在windows上做到这一点?当我尝试包含fnmatch.h时,我得到一个错误。看看这个问题