Ввод необходимо дважды нажать после вставки текста - C - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь получить многострочный текст от пользователя и обработать его построчно, но после вставки из буфера обмена в консоль необходимо дважды нажать клавишу ВВОД для отправки и продолжения. Ожидаемое поведение: CTRL + V, затем ENTER выполняет программу. Фактическое поведение: CTRL + V вставляет текст, ENTER начинает новую строку, а 2nd 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;
}

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Ваш код main имеет все значения oop, которые многократно читают строки ввода, пока вы не введете пустую строку. Таким образом, вам нужно будет ввести пустую строку, чтобы завершить l oop и завершить sh программу. Если ваш текст вырезания и вставки не содержит пустую строку, вам нужно будет ввести одну, поэтому, если вставка вырезки не является полными строками, после нажатия клавиш ctrl-V вам нужно нажать Enter чтобы завершить последнюю строку вставки, затем введите еще раз для ввода пустой строки и выхода l oop.

0 голосов
/ 23 марта 2020

Это не проблема для моего p c (debian).

Если вы попытаетесь заменить ваш код

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

на

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

вы увидите, что код анализируется после того, как вы нажмете ввод, по крайней мере, так будет на linux. Причин этой проблемы может быть две:

  1. , которые вы используете Windows, поэтому вам нужно проверить '\ r \ n' вместо '\ n'.
  2. вы пытаетесь использовать эту программу только с одной строкой, вывод будет напечатан, только если вы нажмете пустую строку, поэтому вам нужно дать первое \ n для анализа Ctrl + V и второе для выхода из программы. В этом случае ваша программа работает нормально.

Надеюсь, эта помощь

...