2016-11-04 86 views
0

我试图制作一个程序,它接受来自ubuntu终端的命令并同时读入一个文件。如果用户键入“-c”,它将读取文件并打印字符计数,如果用户键入“-w”,它将从读取的文件中打印字数,“-l”打印换行的数量字符。无论如何,我试图用fscanf做这个字符数,但它似乎没有工作出于某种原因。任何人都可以解释我做错了什么,或者是否有更好的方法来做到这一点?C语言命令行参数+在文件中读取

#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"); 
    } 
} 

} 
+0

它是'sscanf'而不是'fscanf'从字符串读取。 –

+0

您也可以使用getopt库来解析命令行参数。 –

回答

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

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

  • 您的fscanf格式字符串错误。当您传递字符集时,括号内的值会在%之后,而且您另外还不会使用s。但是当你切换到fgets时,这个问题可以免费解决。

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

  • 读直到换行是你如何计算行数,而不是字符。要读取单个字符,请使用fgetc

相关问题