【问题标题】:Enter needs to be pressed twice after inserting text - C插入文本后需要按两次Enter - C
【发布时间】:2020-03-22 20:59:14
【问题描述】:

我正在尝试一次从用户那里获取多行文本并逐行处理它,但是在从剪贴板插入控制台后,需要按两次 ENTER 才能发送并继续。 预期行为:CTRL+V 然后 ENTER 执行程序。 实际行为:CTRL+V 插入文本,ENTER 开始新行,第二个 ENTER 发送文本。

处理输入的函数:

char* getNewLine(bool* finish){
    char* string;
    string = malloc(sizeof(char));
    string[0]='\0';
    int c;
    int i = 0;

    while( (c = getchar()) != '\n'){
        string = realloc(string, sizeof(char)*(i+2));
        string[i] = (char)c;
        string[i+1] = '\0';
        i++;
    }

    if(i == 0){                         //if last line was empty, stop while loop in main
        *finish = true;
    }

    return string;
}

主程序:

int main(){

    bool finish = false;
    int line_count = 0;                //Number of lines found
    int good_count = 0;                //Lines matches

    char* line;

    while(!finish){                    //Read console line-by-line
        line = getNewLine(&finish);
        if(!finish){
           if(checkString(line)){      //checkString returns true, if string matches some conditions
              good_count++;
           }
        line_count++;
        }
        free(line);
    }

    printf("%d/%d\n", line_count, good_count); 
    return 0;
}

【问题讨论】:

    标签: c input console-application


    【解决方案1】:

    您的main 代码有一个循环重复读取输入行,直到您输入一个空行。因此,您需要输入一个空行来结束该循环并完成程序。如果您的 cut-n-paste 文本不包含空行,则需要输入一个 - 因此,如果您的 cut-n-paste 不是完整的行,则在 ctrl-V 之后,您需要按 enter结束粘贴的最后一行,然后再次输入输入空行退出循环。

    【讨论】:

    • 最好的纠正方法是什么?由于用户不会按 Ctrl + Z,我等不及 EOF。如何区分 '\n' 和 ENTER?
    • 你不能,只要你使用的是终端——就终端而言,它们是一样的。
    【解决方案2】:

    这在我的电脑(debian)上似乎不是问题。

    如果您尝试替换您的代码

    if(checkString(line)){
        good_count++;
    }
    

    printf("line: %s\n",line);
    

    你会看到代码在你按下回车后被解析了,至少在 linux 上是这样。 该问题可能有两个原因:

    1. 您使用的是 Windows,因此您需要检查 '\r\n' 而不是 '\n'。
    2. 你尝试使用这个程序只有一行,只有按下空行才会打印输出,所以你需要给第一个 \n 来解析 Ctrl+V 和第二个退出程序.在这种情况下,您的程序可以正常工作。

    希望有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多