尝试使用命令行ls -l参数作为scanf输入

时间:2015-09-29 23:50:30

标签: c shell scanf

我试图解析ls -l输出以检查文件权限和大小。但是,似乎scanf()函数在空格后不会占用任何内容。这有什么技巧或解决方法吗?我想坚持使用scanf,但如果不可能,那么我愿意接受建议。当我运行下面的程序并仅打印test2"总计"得到了存储。

<#include stdio.h>

int main(int argc, char **argv){

char test[200];
char test2[200];
scanf("%c\n", test);
for(int i = 0; i < 9 ; i++){
    if(test[i] != '\n'){
       test2[i] = test[i];
    }
}
for (int i = 0; i < 9; i++){
    printf("%c\n", test2[i]);
}

return 0;

}

感谢。还有一种方法可以使用ls -l?

来检查某些内容是文件还是目录

3 个答案:

答案 0 :(得分:1)

  

然而,似乎scanf()函数在空格后不会占用任何内容。 ...... scanf("%c\n", test);

它不是scanf(),而是使用的格式。 scanf("%c\n", test);char扫描到test(测试不一定是空字符终止),然后扫描并抛出任何空白区域。它会继续这样做,直到找到非白色空间。

您更希望{1}} 1)扫描并丢弃空白区域,2)扫描最多199个非scanf(" %199[^\n]", test); fgetc(stdin);。 3)在满,EOF或'\n'检测到时停止。然后扫描并抛出下一个字符。

总的来说。最好使用'\n'

fgets()

要明确的是,if (fgets(test, sizeof test, stdin) == NULL) Handle_EOF(); test[strcspn(test, "\n")] = 0; // lop off potential \n. for (size_t i = 0; test[i]; i++){ printf("%c\n", test[i]); } 不是邪恶的,它只是试图做很多事情(IO和转换)。最好分开。

大多数scanf()格式说明符和指令scanf()不区分空格和' '。该行结尾对您的代码至关重要。 '\n'寻找fgets()并像其他任何'\n'一样对待空格。

答案 1 :(得分:0)

感谢。还有一种方法可以使用ls -l检查某些文件或目录是什么吗?

第一行以&#39; total&#39;开头并且可以丢弃。

以下每一行(使用fgets()读取每一行) 以&#39;权限开头#39;

权限的第一个字符表示文件的类型:

'd' directory, 
'c' character oriented device, 
'b' block oriented device, 
'-' normal file, 
'p' for named pipes, 
's' for socket, 
'D' for interprocess communication between client and server (solarus UNIX only)
'l' symbolic link

答案 2 :(得分:0)

你也可以尝试格式化的scanf功能,它允许你指定你期望的输入格式。