2

从控制台成功将重定向文件读取到我的程序后,我要求用户输入一个单词,然后使用 scanf() 读取该单词。

我遇到的问题是 scanf() 立即读取垃圾字符,然后程序继续。它甚至不会暂停让用户在控制台中输入任何内容。当我不打开文件时,它不会发生。其他一切都完美无缺。可能是什么问题:

**我尝试了所有建议,但仍然无法正常工作。我做了一个新项目,只是为了让这部分工作,就是这样。忽略 scanf 只寻找一个字符,即使我要求一个词。我这样做只是为了看看程序是否真的会暂停并允许我输入一些东西,但事实并非如此。只是进入一些垃圾和程序结束。

 main(){

       int n,i;
       char ch;
       char line[80];

       while(fgets(line, 80, stdin) != NULL){
         for(i=0;i<80;i++){
            ch=line[i];
            if(ch=='\n'){
                printf("%c",ch);
                break;
            }
            else{
                    printf("%c",ch);
            }
         }
       }
       printf("Please enter a word: ");
       scanf("%c",&ch);
    }
4

2 回答 2

2

您不能从文件重定向标准输入,然后也使用键盘进行输入(我知道)。如果你想这样做,让程序将输入文件作为命令行参数,然后像这样运行它会更简单 prog myfile.txt:另外,给自己留一个 fgets() 的垫子——使用比分配给 maxlen 的数组少一个。如果最大长度不包括 '\0' 终止字符,则对于需要最大长度的任何内容,使用 C char 数组使用比分配长度小一总是最安全的。

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

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

       {
       FILE *f;
       int i;
       char line[80];

       if (argc<2)
           {
           printf("Usage:  %s <inputfile>\n",argv[0]);
           exit(10);
           }
       /* Open file and echo to stdout */
       f=fopen(argv[1],"r");
       if (f==NULL)
           {
           printf("Cannot open file %s for input.\n",argv[1]);
           exit(20);
           }
       while (fgets(line, 79, f) != NULL)
           printf("%s",line);
       fclose(f);

       /* Get user input from stdin */
       printf("Please enter a word: ");
       if (fgets(line,79,stdin)==NULL)
           {
           printf("Nothing entered.  Program aborted.\n");
           exit(30);
           }
       /* Remove CR/LF from end of line */
       for (i=strlen(line)-1;i>=0 && (line[i]=='\n' || line[i]=='\r');i--)
           ;
       line[i+1]='\0';
       printf("The word entered is: '%s'\n",line);
       return(0);
       }
于 2013-10-04T04:54:43.220 回答
0

sscanf 用于从流或缓冲区输入,在 unix 中,stdin 被视为文件,因此您应该使用从文件输入的 fscanf,因此请使用 fscanf(stdin,"%s",testword);

于 2013-10-04T05:02:14.530 回答