【发布时间】:2021-01-13 18:43:54
【问题描述】:
我正在尝试通过 c 程序模仿 ls -l 命令 但不幸的是没有得到如何忽略文件,如 “。” , ".." 和 ".filename" 但不是 filename.c 我设法找到 .在文件名中并忽略,但后来意识到我什至丢失了 filename.c
实际内容是
.
..
.bitfile
.gnupg
krishna
program.c
temp
现在我的代码是
while ((dir = readdir(d)) != NULL)
{
if (strstr(dir->d_name, ".") != NULL || strstr(dir->d_name, "..") != NULL)
continue;
strcpy(array[i], dir->d_name);
i++;
}
数组中的内容是:
krishna
temp
但预期的输出是
krishna
program.c
temp
【问题讨论】:
-
if(dir->d_name[0] == '.') continue;在您的情况下,您可以使用if (strstr(dir->d_name, ".") == dir->d_name)的子字符串测试字符串 began -
请注意,Weather Vane [和 P.J.] 的建议是正确的。虽然不太紧凑,但您想要的代码不是
strstr而是strcmp。您需要比较0和 notNULL(例如):strcmp(dir->d_name, ".") == 0您可能需要查看ls的-a和-A选项,因为它们会改变是否.文件是否显示。 -
@CraigEstey 如何与
.filename合作? -
@CraigEstey 你可以用一些像
strncmp(dir->d_name, ".",1)这样的变态方式来做到这一点。但这是检查单个字符的相当荒谬的方式。 -
@P__JsupportswomeninPoland 我并不是在提倡
strcmp而不是[0] == '.'方法,只是 OP 希望strcmp用于他/她的方法。通常,我们希望strcmp[或if ((d_name[0] == '.') && ((d_name[1] == '.') || (d_name[1] == 0)))] 捕获.和..棘手的部分是我们想要模拟ls并跳过以.开头的文件[甚至@987654347 @],这样可以简化测试。