2010-08-24 11 views

risposta

13

E '

scanf("%[^\t\n]",string); 
+0

@subhashis: c'è qualche possibilità di accettarlo se ha incontrato l'intento originale? – Chubsdad

+0

Se l'input inizia con ''\ t'' o'' \ n'' come '" \ t123 456 "', nulla viene letto in 'stringa'. – chux

3

I non pensare che questo sia possibile con scanf(). Se si conosce il numero di parole che si desidera leggere, si può leggere con

char str1[100], str2[100]; 
scanf("%s %s", str1, str2); 

Si noti che questo è un enorme lacuna nella sicurezza, dal momento che un utente può facilmente inserire una stringa che è più lungo dello spazio allocato.

Se non si conosce il numero di parole, potrebbe essere necessario riformulare la domanda. Per cosa hai bisogno di leggerlo? Perché non vuoi usare gets(), perché deve essere scanf()?

+1

Ovviamente 'gets' è una sua scappatoia per la sicurezza, e si dovrebbe usare' fgets'. –

+6

non esiste una "enorme scappatoia per la sicurezza" se si utilizza il noto parametro scanf-format come "scanf ("% 99s% 99s ", str1, str2)" – user411313

+0

Grazie gordon, non sapevo del campo larghezza del formattatore . Ma come saranno gestite le parole con> 99 caratteri? I caratteri vengono scartati correttamente o si attardano nel buffer di input e causano il fallimento del successivo formattatore? –

1

Si potrebbe leggere una intera linea da un file se si vuole con:

scanf("%[^\n]\n", line); 

Ora, si potrebbe usare sscanf per ottenere ogni parola:

sscanf(line, "%s", word); 
line += strlen(word) + 1; 

"linea" e "parola" sono puntatori di carattere.

Nota come va la linea per arrivare alla parola successiva.

+0

'scanf ("% [^ \ n] \ n ", riga);' ** non ** leggerà sempre un'intera riga. Non salva nulla in 'line' l'input è' "\ n" 'e il' '\ n'' rimarrà in 'stdin'. 'sscanf (line,"% s ", word);' non salverà nulla in 'word' se' line' è costituito solo da white-space. – chux

3
char name[50]; 
printf("Enter your full name: "); 
scanf("%[^\n]s",name); 

Qui [^\n indica che scanf() sarà continuare a ricevere i caratteri in name[ ] fino ad incontrare un \n.

+3

Non c'è bisogno di 's' in' scanf ("% [^ \ n] s", nome); '. – chux

2

Meglio utilizzare fgets() rispetto a scanf() per leggere una riga di input dell'utente.

Se il codice deve utilizzare scanf() poi

char buf[100]; 

// Read up to 99 char and then 1 \n 
int count = scanf("%99[^\n]%*1[\n]", buf); 

if (count == EOF) { 
    Handle_EndOfFile(); // or IO error 
} 

if (count == 0) { // Input began with \n, so read and toss it 
    scanf("%*c"); 
} 

parse buf per le singole parole.

1
char field1[40]; 
char field2[40]; 
char field3[40]; 
char field4[40]; 
char field5[40]; 
char field6[40]; 
/* 
* sscanf(workarea, format, field of pointers) 
* Interpret [^ ]  as a field ending in a blank 
* Interpret [^' '] as a field ending in a blank 
* Interpret [^ |\t] as a field ending in blank or tab char 
* Interpret [^' '|\t] as a field ending in blank or tab char 
* Interpret [^ |\t\n] as a field ending in blank, tabchar or end-of-line 
* 
*/ 
strcpy(workarea,"Bread milk eggs cheese tomatoes cookies \n"); 
i=sscanf(workarea," %[^' '|\t] %[^[' '|\t] %[^' '|\t] %[^' '|\t] %[^' '|\t] %[^' '|\t|\n] ", 
      field1,field2,field3,field4,field5,field6); 

questa scansione si traduce in field1 contenenti "Pane", field2 contenente "latte", ... field6 contenente "cookies". Tra le prime e le ultime parole è possibile uno o più spazi vuoti o tabulati Il termine che segue i cookie può essere uno dei tre spazi, tab o newline che verranno eliminati e non faranno parte dei "cookies".

Problemi correlati