我试图创建一个从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");
}
}
}
答案 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
。