2010-10-26 12 views
5

scanf ("% s", str) non lo farà. Smetterà di leggere al primo spazio. gets (str) non funziona quando la stringa è grande. Qualche idea?Come posso leggere una stringa con spazi al suo interno in C?

+2

'gets' non funziona mai. È un errore intrinseco usare mai "ottiene". Usa 'fget'. –

+0

Forse è la mia versione di c che non accetta affatto ottiene ... Grazie! – Johny

+0

@Johnny: L'ammonizione di R contro l'uso di 'gets()' è dovuta al fatto che usarlo introduce un * enorme * buco di sicurezza nel codice, non che il tuo particolare compilatore abbia un problema con esso (non dovrebbe;() 'è stato parte della C dall'inizio). È stato deprecato a partire da C99 e non dovrebbe più essere utilizzato. –

risposta

13

utilizzare fgets con STDIN come flusso di file. Quindi puoi specificare la quantità di dati che vuoi leggere e dove metterli.

+0

in realtà è così: – Johny

+0

fgets (str1, 100, stdin); fgets (str2, 100, stdin); Non verrò chiesto per la prima stringa. Va direttamente al secondo. Grazie per la risposta rapida. – Johny

+0

Non sono sicuro del significato del tuo commento: qualcosa non funziona? –

1

Quando vuoi smettere di leggere? A EOF, a un personaggio specifico, o cosa?

Si può leggere un determinato numero di caratteri con% c

c corrisponde ad una successione di larghezza count caratteri (default 1); il prossimo puntatore deve essere un puntatore al carattere, e deve esserci spazio sufficiente per tutti i caratteri (non viene aggiunto NUL in chiusura). Il solito salto dello spazio bianco iniziale viene soppresso. Per saltare lo spazio bianco , utilizzare uno spazio esplicito nel formato.

È possibile leggere i caratteri specifici (o fino a quelli esclusi) con% [

[corrisponde a una sequenza non vuota di caratteri del set di caratteri accettati specificato; il puntatore successivo deve essere un puntatore a char, e ci deve essere spazio sufficiente per tutti i caratteri nella stringa , più un carattere NUL di fine. La solita ignoranza dello spazio iniziale bianco viene soppressa. La stringa deve essere composta da caratteri in (o non in) un determinato set; il set è definito dai caratteri tra parentesi aperta [carattere e parentesi chiusa] charac- ter. L'insieme esclude quei caratteri se il primo carattere dopo la parentesi aperta è una circostanza circoscritta ^. Per includere una parentesi chiusa nella serie , impostarla come primo carattere dopo la parentesi aperta o il cerchio di direzione; qualsiasi altra posizione finirà il set. Il carattere trattino - è anche speciale; se collocato tra due altri caratteri, aggiunge tutti i caratteri che intervengono sul set. Per includere un trattino, farlo diventare l'ultimo carattere prima della parentesi chiusa finale . Ad esempio, `[^] 0-9-] 'significa l'insieme ` `tutto eccetto parentesi chiusa, da zero a nove e trattino' '. La stringa si conclude con la comparsa di un personaggio non nel (o, con un cir- cumflex, in) impostare o quando la larghezza del campo si esaurisce

+0

Non voglio solo spazi vuoti tra la stringa. Ho provato scanf ("% [^ \ n]", str); ma non ha funzionato neanche. Grazie comunque! – Johny

+0

Quindi vuoi leggere un'intera linea? –

+0

Immagino che questo significhi fino a 79 caratteri, giusto? Ho bisogno di una stringa che potrebbe essere più grande. – Johny

2

creare la propria funzione per leggere una riga. Ecco cosa si deve fondamentalmente a che fare:

 
1. fgets into allocated (growable) memory 
2. if it was a full line you're done 
3. grow the array 
4. fgets more characters into the newly allocated memory 
5. goto 2. 

L'implementazione può essere un po 'complicato :-)

È necessario pensare a ciò che è necessario passare alla funzione (per lo meno l'indirizzo del la matrice e le sue dimensioni); e cosa restituisce la funzione quando tutto "funziona" o quando si verifica un errore.Devi decidere cosa è un errore (è una stringa di 10 Gbyte lunga senza '\ n' un errore?). Devi decidere come far crescere l'array.


Modifica

In realtà può essere meglio per fgetc piuttosto che fgets

 
get a character 
it it EOF? DONE 
add to array (update length), possible growing it (update size) 
is it '\n'? DONE 
repeat 
1

Per leggere stringa con lo spazio che si può fare come segue:

char name[30],ch; 

i=1; 
while((ch=getchar())!='\n') 
{ 
name[i]=ch; 
i++; 
} 
i++; 
name[i]='\n'; 
printf("String is %s",name); 
+0

'ch' dovrebbe essere' int' per distinguere 'EOF' da tutti gli altri' char'. Come è ora, 'while ((ch = getchar())! = '\ N')' è un ciclo infinito dovrebbe 'EOF' essere restituito da' getchar() '. – chux

4
char str[100]; 

Prova questo

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

o questo

fgets(str, sizeof str, stdin)) 
+0

1) Non c'è motivo per 's' in' "% [^ \ n] s" '. 2) 'scanf ("% [^ \ n] ... 'non scansionerà nulla e non salverà nulla in' str' se l'input è '" \ n "'. 3) 'scanf ("% [^ \ n] .. .' non protegge da input grandi. 4) 'scanf ("% [^ \ n] ... 'lascia' '\ n'' in 'stdin'. – chux

Problemi correlati