3

我想知道如何从未知的输入源读取数据,这意味着我不知道用户是要输入一个句子还是要给我一些文本文件。我已经尝试过使用fscanf,因为我已经阅读过它适用于未格式化的输入类型这是我的代码,我想获得某种类型的输入(文件或只是一个句子(echo bla bla bla)并且"int"只打印第"int"一个单词。该程序应该用于管道意味着命令看起来像这样:
有两种使用程序的方法:

1.echo "blabla" | myprog 2  (number of words to print)
2.cat input.txt | myprog 2  (number of words to print)

有问题的行是第 16 行,我尝试使用fscanf
Thanks!

  1 #include <stdio.h>
  2 #include <ctype.h>
  3 #include <string.h>
  4 #include <stdlib.h>
  5
  6
  7 int main(int argc, char *argv[]){
  8    char *words[32];
  9    int numofwords = atoi(argv[2]);
 10    int i=0;
 11    int len;
 12    char *word = malloc (32 * sizeof(char));
 13    char c;
 14   while (i<=numofwords){
 15    if ((c = getc (argv[1])) != EOF){
 16         fscanf(argv[1],"%s",&word);
 17         len = strlen (word);
 18         words[i] = malloc ((len+1) * sizeof(char));
 19         i++
 20    }
 21    printf(words[i]);
 22   }
 23   return 0;
 24 }
 25
4

3 回答 3

4

可能是我正确理解了您的需求。

我不是在纠正你的代码,而是在编写我自己的代码。

下面是从控制台读取的简单代码: 代码:main.c

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[]){
    if(argc!=2){
        printf("\n wrong number of argument\n");
        exit(1);
    }
    int numofwords = atoi(argv[1]);
    char buffer[128];

    //printf("%d\n",numofwords);

    while(numofwords--){
        scanf("%s",buffer);
        printf("%s\n",buffer);
    }
    return 0;
}   

它是如何工作的:

~$ gcc  main.c -o main  

执行:

:~$ ./main 

wrong number of argument
:~$ ./main 2
grijesh
grijesh
yourname        
yourname
:~$ 

我希望你能理解。该程序只需从控制台读取(扫描)并打印到控制台。while 循环运行您传递命令行输入的次数。

现在,一个文本文件dumy.txt一个输入文件:

:~$ cat dumy.txt
yourname
myname
hisname
hername
:~$   

现在看看你想通过你的代码实现什么:

:~$ cat dumy.txt | ./main 2
yourname
myname
:~$   

如果你想通过echo

:~$ echo $'one\ntwo\nthree' | ./main 2
one
two
:~$   

这是你想要的吗?

如果是:

你想念的是:

[你的代码]

错误 1,2
您的 fsacnf 在两个方面是错误的:

fscanf(argv[1],"%s",&word);  
  • 第一个论点是argv[1]char*需要传递FILE*类型是错误的。正如 Oli Charlesworth 先生的回答中所解释的那样。

  • 其次,您仍然需要从stdin. |运算符将输出从第一个命令重定向到第二个命令。

错误 3, 4, 5, 6
通过发送echo "blabla",您只是发送一个刺痛,您需要像我一样做一些事情(我在新行的回显字符串中添加了 \n 并且我的回显字符串以开头,$因此它不会打印为原始字符串)。echo 以便您可以根据argv[1]不是的第二个参数从代码中读取argv[2]。因此,在您的代码中,以下行也是错误的。

int numofwords = atoi(argv[2]);   

我在我的代码中更正了这一行。

i初始化为零i = 0,在while循环条件下<=,我认为应该是<

错误7
你运行代码的方式是错误echo "blabla" | myprog 2的,你的程序不知道mygrog你必须通过完整的路径。像我一样./main./表示当前目录。

这只是我对你的问题的看法。另请阅读 William Pursell 先生在评论中给出的答案。

如果您还有其他疑问,请告诉我。

于 2013-01-19T14:21:10.927 回答
3

另一种选择是将文件名作为参数传递。

  1. 回声“blabla” | myprog 2(要打印的字数)
  2. myprog 2 input.txt(要打印的字数)

然后你会:

  • 如果 argc == 1,则正常继续并使用 fgetc 或其他替代 f* 方法处理标准输入(标准输入是 FILE*)。
  • 如果 argc == 2,则从 argv[1] 获取文件名,使用 fopen(filename) 获取 FILE* 并处理它。

否则,您将按照 Oli 所说的操作并获取第一个单词,然后 fopen 并传递给您的处理函数,或者 fseek(stdin, SEEK_SET, 0) 然后将 stdin 传递给您的处理函数。

于 2013-01-19T14:23:05.000 回答
3

我不确定您的问题到底是什么,但我认为可能是“如何将文件输入和控制台输入视为相同?”。

您是否知道stdin(标准输入)已经是FILE *? 这意味着您可以将它作为第一个参数传递给fscanf,就像“普通”文件一样:

FILE *normal_file = fopen(...);

// Read from normal file
fscanf(normal_file, "%d", &x);
// Read from stdin
fscanf(stdin, "%d", &y);
于 2013-01-19T13:34:26.123 回答