C语言命令行参数+文件读取

时间:2016-11-04 13:37:36

标签: c linux command-line command-line-arguments

我试图创建一个从ubuntu终端获取命令并同时读取文件的程序。如果用户输入" -c"那么命令就是如果用户键入" -w"它将读取文件并打印字符数。它从读取的文件打印字数," -l"打印换行符的数量。无论如何,我试图用fscanf为字符数做这个,但它似乎不能用于某些原因。任何人都可以解释我做错了什么或者有更好的方法吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


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

int i;
char words[1000];
int counter = 0;
for(i = 0; i < argc; i++){
  if(strncmp(argv[i], "-c", 2) == 0){
     if(argv[i + 1] != NULL){
        while((fscanf(argv[i + 1], "[^\n]%s", words[i])) != EOF){
           counter++;
        }
     printf("%d characters\n", counter); 
     }
     printf("print character count\n");
  }
  else if(strncmp(argv[i], "-w", 2) == 0){
     printf("print word counts\n");
  }
  else if(strncmp(argv[i], "-l", 2) == 0){
     printf("print newline counts\n");
  }
  else if(strncmp(argv[i], "-h", 2) == 0){
     printf("prints help\n");
  }
}

}

1 个答案:

答案 0 :(得分:2)

  • fscanf的第一个参数是开放流,而不是文件名。您需要将文件名传递给fopen以获取流。

  • 您尝试使用fscanf的方式非常不安全,与gets一样糟糕,因为它很容易溢出固定大小的缓冲区。将缓冲区大小作为参数的fgets会好得多。

  • 您的fscanf格式字符串错误。当您传递一个字符集时,括号内的值会在%之后,而不是之前的s,并且您不再使用fgets。但是当你切换到fscanf时,这个问题就会免费。

  • fscanf接收值的参数需要是指针,但是您传递的是一个数组元素。因为scanf是varargs,所以这只是未定义的行为。 (有些编译器对fgetc格式代码进行了特殊处理,并会警告您类型不匹配,但是没有检测varargs类型不匹配的一般方法。

  • 读取直到新行是你如何计算行数,而不是字符数。要阅读单个字符,请使用Client fields value 111 Decision accept 111 Status deposited 112 decision accept 113 Decision accept 114 Decision accept 114 Status contract 115 Decision Conditional Accept 115 Status deposited 116 Decision Conditional Accept 117 Decision Conditional Accept 118 Status contract 118 Decision Conditional Accept