【问题标题】:Issues with scanf reading input too soon?scanf 读取输入太快的问题?
【发布时间】:2018-08-04 16:49:57
【问题描述】:

我的问题如下:我需要 scanf 来读取多行用户输入。用户可以输入由空格或换行符分隔的任意字符组合。我的目标是获取由空格或换行符分隔的每个输入,并处理它并通过 printf 输出。但是,我不允许一次存储多个输入。我的问题是:每次用户按下回车键时,scanf 都会读取整行,因为我在 while 循环中有 scanf != EOF。但是,在用户按下 EOF 之前,我不希望 scanf 读取所有输入行。这可能吗?以下是一些示例:

一些伪代码:

User Input:
cat dog mouse rabbit
snake dog
pink bob
joke*/

//Some pseudo code:

char input[100];
while (scanf("%s", input) != EOF) {
    printf("%s", input);
}

总而言之,我不希望 scanf 在用户按 Enter 时读取,因为如果确实如此,那么 printf 将激活但仍允许用户输入内容。 有没有办法绕过这个?注意:我必须使用 scanf 并且不能在单个数组中存储多个单独的输入(如狗或猫)。 谢谢。

【问题讨论】:

  • 使用%sscanf() 表示“我不在乎空白”。如果您确实关心空白,您可能根本不应该使用scanf(),当然也不应该使用%s。您可能正在使用%[…](扫描集)或%[^…](否定扫描集),但即使这样也是有问题的。
  • 谁说你必须使用scanf?这是某种家庭作业,有限制吗?我是一名专业的 C 程序员,我已经做了 35 年的专业 C 程序员,我不仅不会使用scanf 来解决这个问题,而且我根本不会使用scanf。与使用其他更好的技术相比,使用scanf 进行任何类型的有趣输入处理通常要困难得多。 (如果这是家庭作业,你别无选择,我很同情你。)
  • 每 cmets(关于我即将删除的答案),任务是在写入任何输出之前读取所有输入。显然,如果不存储一些数据,这是不可能的:在读取输入之后和输出之前的任何时间点,程序都必须包含产生输出所需的信息。此信息可以是输入的副本或处理输入产生的某些信息,但它必须存在于程序状态中。如果程序不能存储“多个输入”,那么它必须具有从中派生的信息才能产生输出。
  • 鉴于上述情况,问题陈述应该解释如何处理输入。例如,如果任务是对单词的长度求和,并且允许存储到目前为止的长度但不存储单词,那么可以找到解决方案。

标签: c scanf


【解决方案1】:

只需使用二维数组,其中每一行存储输入字符串的一行。至于接受输入,要求用户输入他/她将要给出的行数并循环遍历它。

#include<stdio.h>
void main(){
    char inp[10][50];
    int i,j,n;
    printf("\nenter the number of lines: ");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf(" %[^\n]s",inp[i]);
    }
    //for printing it out.. follow the same with printf
    printf("\nthe strings are:\n");
    for(i=0;i<n;i++){
        printf("%s\n",inp[i]);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    相关资源
    最近更新 更多