我现在已经挣扎了好几天了.
我想创建一个遍历目录的函数,选择扩展名为*.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)
编辑:修复格式
您必须取消引用指针以查看它指向的值:
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.
这并不快,但它更清晰,因为它只使用众所周知的标准字符串函数在更高级别运行.