2015-12-13 2 views
-3
#define _GNU_SOURCE 
#include <stdio.h> 
#include <stdlib.h> 

char split_text(){ 

    int bytes_las; 
    int antal_bytes = 40; 
    char *min_strang; 

    printf("Enter text: "); 

    min_strang = (char *) malloc (antal_bytes + 1); 
    bytes_las = getline (&min_strang, &antal_bytes, stdin); 

    printf("\n%s",min_strang); 

} 


int main() 
{ 
    printf(" MENU:\n"); 
    printf("1) Split text\n"); 
    printf("2) Upper case to lower case\n"); 
    printf("3) Lower case to upper case\n"); 
    printf("4) Remove character\n"); 
    printf("5) Add character\n"); 
    printf("6) Replace character\n"); 
    printf("7) Statistics\n"); 
    printf("8) Sort text\n"); 
    printf("0) Exit\n"); 


    int i; 
    char option; 

    for(i=0; i<5;i++){ 


     printf("I want: "); //assign the option number 
     option = getchar(); 
     switch(option) {    //use function assigned to what option 

     case '1' : 
       printf("do for 1\n"); 
      split_text(); 
       break; 

     case '2' : 
       printf("do for 2\n"); 
      break; 

     case '3' : 
       printf("do for 3\n"); 
      break; 

     case '4' : 
       printf("do for 4\n"); 
      break; 

     case '5' : 
       printf("do for 5\n"); 
      break; 

     case '6' : 
       printf("do for 6\n"); 
      break; 

     case '7' : 
        printf("do for 7\n"); 
      break; 

     case '8' : 
       printf("do for 8\n"); 
      break; 

     case '0' : 
       printf("do for 0\n"); 
      exit(0); 

     default : 
      break; 
     } 

    } 
} 

Это моя функция в отдельном файле. При вызове его функция читает, и я получаю правильный вывод «Введите текст:». Однако нет предела. Когда я нажимаю клавишу Enter, ничего не происходит, просто продолжает принимать входные данные.getline(); in C не останавливать ввод

Я довольно новичок в C, и мне нужно использовать эту функцию. Я на Ubuntu и использую только C, не компилируя ошибки. Застрял в этой проблеме в течение двух дней.

+4

код вы вывесили выглядит отлично. Отправьте сообщение [mcve] (http://stackoverflow.com/help/mcve). Возможно, вы вызываете 'split_text()' в цикле? –

+0

Где вы возвращаете строку, прочитанную вызывающей программе? – chqrlie

+0

@chqrlie возврат не думаю. Он должен освободить блок памяти после того, как он с ним справится. – Michi

ответ

0

Вы можете закончить ввод различными способами, один может быть:

ssize_t read; 
read=getline(&min_strang, &antal_bytes, stdin); 

if(read < 1){ 
    printf("Input ends here\n"); 
      return 1; 
    } 

Это заканчивается, когда нет больше писать.

0

Проблема заключается в том

 option = getchar(); 

в качестве входных данных, как правило, линии буферизации ввод е. г. 1\n, i. е. вы помещаете два символа во входной буфер, из которых вы потребляете только 1 с getchar(), а \n остается в буфере. Когда после этого вызывается getline(), он получает следующий символ из буфера, и этот \n сразу вызывает getline(), чтобы вернуть пустую строку.
Чтобы исправить это, потреблять вход меню до \n, так что getline() должен прочитать новый вход:

 option = getchar(); if (option != '\n') while (getchar() != '\n') ;