2014-12-15 4 views
11

Próbuję napisać wprowadzony ciąg w innym miejscu i nie wiem, jak zlikwidować nową linię, która pojawia się jako część tego ciągu, który uzyskuję ze stdin i fgets.Jak mogę uzyskać ciąg znaków z danych wejściowych bez dodawania nowej linii za pomocą fgets?

char buffer[100]; 
memset(buffer, 0, 100); 
fgets(buffer, 100, stdin); 
printf("buffer is: %s\n stop",buffer); 

Starałem się ograniczyć ilość danych, które fgets dostaje jak również ograniczenie, ile danych jest napisane, ale nowa linia pozostaje. Jak mogę po prostu wprowadzić wprowadzony ciąg do ostatniego znaku napisanego z niczym więcej?

+0

'scanf ("% 99 [^ \ n%] * c" bufor);' – BLUEPIXY

+0

@ BLUEPIXY 'scanf ("% 99 [^ \ n]% * c ", bufor)' nie odczytuje niczego w 'buforze' jeśli pierwszy' char' jest ''\ n''. '' \ N'' pozostaje w 'stdin'. – chux

+2

Czy chcesz przeczytać linię i pozostawić '\ n'' w strumieniu wejściowym, czy chcesz przeczytać wiersz zawierający' \ n'', a następnie odrzucić '\ n''? (Wpłynie to na następną operację wejścia, która będzie lub nie będzie czekała na niego ''\ n''.) –

Odpowiedz

1

Od strony człowieka Linux:

fgets(): [...] Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. [...]

Stąd, jeśli chcesz korzystać z tej funkcji, można go usunąć ręcznie. Z drugiej strony możesz użyć fgetc, aby uzyskać znaki, dopóki nie znajdziesz '\n' i nie włączysz ich do bufora. To byłoby coś takiego:

char c; 
while((c=fgetc(stdin)) != '\n') 
    buffer[i++] = c; 
+2

To jest nieskończona pętla powinna' fgetc() 'return' EOF'. – chux

+0

pewna rzecz @chux, chociaż moim zamiarem było po prostu szkicowanie odpowiedzi. dzięki za wskazanie tego. –

+0

'char c = fgetc (stdin)' jest po prostu [źle] (http://stackoverflow.com/questions/35356322/difference-between-int-and-char-in-getchar-fgetc-and-putchar-fputc/ 35356684 # 35356684). –

2

spróbować

fgets(buffer, 100, stdin); 
size_t ln = strlen(buffer)-1; 
if (buffer[ln] == '\n') 
    buffer[ln] = '\0'; 
2

Wystarczy spojrzeć na potencjalne '\n'.

Po wywołaniu fgets(), Jeśli '\n' istnieje, to będzie ostatni char w łańcuchu (tuż przed '\0').

size_t len = strlen(buffer); 
if (len > 0 && buffer[len-1] == '\n') { 
    buffer[--len] = '\0'; 
} 

użytkowania Próbka

char buffer[100]; 
// memset(buffer, 0, 100); not needed 
if (fgets(buffer, sizeof buffer, stdin) == NULL) { // good to test fgets() result 
    Handle_EOForIOerror(); 
} 
size_t len = strlen(buffer); 
if (len > 0 && buffer[len-1] == '\n') { 
    buffer[--len] = '\0'; 
} 
printf("buffer is: %s\n stop",buffer); 

Uwagi:

buffer[strlen(buffer)-1] jest niebezpieczne w rzadkich przypadkach, gdy pierwszy char w buffer jest '\0' (wbudowany znak null).

scanf("%99[^\n]%*c", buffer); jest problemem, jeśli pierwszy char jest '\n', nic nie jest odczytywany i '\n' pozostaje w stdin.

strlen() jest szybkie w porównaniu z innymi sposobami: https://codereview.stackexchange.com/a/67756/29485

lub zwijania własnych kod jak gets_sz

Powiązane problemy