【问题标题】:comparing strings to certain pattern将字符串与特定模式进行比较
【发布时间】:2016-02-12 14:02:22
【问题描述】:

#1

如何检查文件是否属于特定类型?

我试图这样做:

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

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


#2

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

例如:

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

【问题讨论】:

标签: c


【解决方案1】:

你可以试试这个。

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

【讨论】:

  • 我希望看到 const char* 扩展名,并且不要忘记检查文件名的长度是否足以使 len - 4 有效。
  • Methinks len
【解决方案2】:

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

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

空白字符列表可能不完整,但可能对您有用。

【讨论】:

  • 如果你能展示如何检查这个是否成功/匹配,我会投赞成票。 []%n 都不是 *scanf() 的日常功能,可能会让初学者感到困惑。 (length &gt;= 4?)
  • 其实我觉得你可以跳过 %n 只检查 sscanf() 的返回值,如果不为零就会匹配。
  • 返回码为“输入项成功匹配并分配的数量”。 %*[ 禁止赋值,%n 不是输入项。检查它,总是返回零,所以length &gt;= 4 是正确的检查。 (实际上,因为 ".txt" 单独 not 匹配 -- %[ 匹配 1..n,而不是 0..n -- 任何匹配都会给出 length &gt;= 5。)
  • 啊,真可惜。我想那你需要实际阅读一些东西。
【解决方案3】:

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

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

如果完整路径的文件名部分不包含扩展名但整个路径包含扩展名(然后strcmp 不返回0),或者根本没有句号,这甚至不会失败整个路径(然后strrchr 返回NULL)。

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

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

【讨论】:

    【解决方案4】:

    有一个功能完全符合您的要求,没有任何技巧。 它叫做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 &lt;fnmatch.h&gt;

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-06
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多