如何检查c中的文件扩展名?

Yot*_*tam 3 c arrays char

我现在已经挣扎了好几天了.

我想创建一个遍历目录的函数,选择扩展名为*.csv的所有文件并读取其中的数据.

我创建了一个函数,通过检查字符串以.csv结尾来检查合法的每个文件名.为此,我想转到char*数组的末尾.我试过这个:

 char * point = file_name;
 while (point != "\0"){
    point += 1;
 }
Run Code Online (Sandbox Code Playgroud)

它通过char*数组而没有找到和"\ 0".

如果我写

*point != "\0"
Run Code Online (Sandbox Code Playgroud)

编译器警告我,我正在将char和int进行比较.

我应该注意到我使用了文件名

 dirent->d_name
Run Code Online (Sandbox Code Playgroud)

nos*_*nos 10

point != "\0" 比较指向另一个指针的指针,这不是你想要的.

你想比较任何point点,给一个值为0的char.所以使用eg

*point != '\0'; 
Run Code Online (Sandbox Code Playgroud)

注意,如果你想找到字符串的结尾,你也可以这样做

point = file_name + strlen(filename); 
Run Code Online (Sandbox Code Playgroud)

如果你想检查一个字符串是否以.csv结尾,你也可以这样做

if((point = strrchr(filename,'.')) != NULL ) {
     if(strcmp(point,".csv") == 0) {
          //ends with csv
      }
  }
Run Code Online (Sandbox Code Playgroud)

编辑:修复格式


unw*_*ind 7

您必须取消引用指针以查看它指向的值:

while (*point != '\0')
  point++;
Run Code Online (Sandbox Code Playgroud)

请注意,右侧是字符文字(单引号),而不是字符串(双引号).这可以修复尝试使用字符串时出现的警告.

另请注意,找到字符串的末尾来检查它是非常必要的.更好的方法是:

int ends_with(const char* name, const char* extension, size_t length)
{
  const char* ldot = strrchr(name, '.');
  if (ldot != NULL)
  {
    if (length == 0)
      length = strlen(extension);
    return strncmp(ldot + 1, extension, length) == 0;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

用例如ends_with("test.foo","foo",3)调用上面的内容并返回1,如果没有找到匹配则返回0.

这并不快,但它更清晰,因为它只使用众所周知的标准字符串函数在更高级别运行.