输入文字后需要按两次回车 - C

Enter needs to be pressed twice after inserting text - C

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

处理输入的函数:

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

    while( (c = getchar()) != '\n'){
        string = realloc(string, sizeof(char)*(i+2));
        string[i] = (char)c;
        string[i+1] = '[=10=]';
        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;
}

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

如果您尝试替换您的代码

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

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

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

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

希望对您有所帮助

您的 main 代码有一个循环,它会重复读取输入行,直到您输入一个空行。所以你需要输入一个空行来结束循环并完成程序。如果您的剪切粘贴文本不包含空行,您需要输入一个空行——所以如果您的剪切粘贴文本不是完整的行,在 ctrl-V 之后,您需要按回车键结束粘贴的最后一行,然后再次输入输入一个空行并退出循环。