2014-12-15 8 views
11

Sto provando a scrivere una stringa immessa altrove e non so come eliminare la nuova riga che appare come parte di questa stringa che acquisisco con stdin e fgets.Come posso ottenere una stringa dall'input senza includere una newline usando fgets?

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

ho cercato di limitare la quantità di dati che fgets ottiene oltre a limitare la quantità di dati è scritto, ma la nuova linea rimane. Come posso semplicemente ottenere la stringa immessa fino all'ultimo carattere scritto con nient'altro?

+0

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

+0

@ 'Scanf ("% 99 [^ \ n]% * c ", buffer)' non leggerà nulla in 'buffer' se il primo' char' è ''\ n''. Il ''\ n'' rimane in' stdin'. – chux

+2

Vuoi leggere una riga e lasciare il ''\ n'' nel flusso di input, o vuoi leggere una riga che include'' \ n'' e poi scartare il ''\ n''? (Ciò influirà sulla prossima operazione di input, che vedrà o non vedrà il ''\ n'' in attesa di esso.) –

risposta

1

da pagine man di Linux:

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

Quindi, se si desidera utilizzare questa funzione è possibile rimuovere manualmente. D'altra parte, è possibile utilizzare fgetc per ottenere caratteri finché non si trova lo '\n' e non lo si include nel buffer. Sarebbe qualcosa di simile:

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

Questo è un ciclo infinito dovrebbe' fgetc() 'return' EOF'. – chux

+0

cosa sicura @chux, anche se il mio intento era solo quello di abbozzare la risposta. Grazie per la segnalazione. –

+0

'char c = fgetc (stdin)' è solo [sbagliato] (http://stackoverflow.com/questions/35356322/difference-between-int-and-char-in-getchar-fgetc-and-putchar-fputc/ 35356684 # 35356684). –

2

provare

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

basta guardare per il potenziale '\n'.

Dopo aver chiamato fgets(), se '\n' esiste, sarà l'ultimo char nella stringa (appena prima del '\0').

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

utilizzo Esempio

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); 

Note:

buffer[strlen(buffer)-1] è pericoloso in rare occasioni in cui il primo char in buffer è un (carattere nullo incorporato) '\0'.

scanf("%99[^\n]%*c", buffer); è un problema se il primo è char'\n', nulla viene letto e '\n' rimane in stdin.

strlen() è velocemente rispetto ad altri metodi: https://codereview.stackexchange.com/a/67756/29485

O rotolare il proprio codice come gets_sz

Problemi correlati