2010-07-10 13 views
11

Desidero che l'utente inserisca una stringa e quindi assegni l'input a una NSString. In questo momento il mio codice è simile al seguente:Utilizzo di scanf con NSStrings

NSString *word; 

scanf("%s", &word); 

risposta

7

scanf non funziona con qualsiasi tipi di oggetti. Se si dispone di una stringa C e si desidera creare una NSString, utilizzare -[NSString initWithBytes:length:encoding:].

+0

Come si crea una stringa c? Puoi modificare il mio codice per mostrarmi come. – Omar

+0

Una stringa C è un array di caratteri per cui devi semplicemente scrivere 'char word [100]'. –

8

La funzione scanf legge in una stringa C (in realtà un array di char), in questo modo:

char word[40]; 

int nChars = scanf("%39s", word); // read up to 39 chars (leave room for NUL) 

È possibile convertire un array di caratteri in NSString come questo:

NSString* word2 = [NSString stringWithBytes:word 
            length:nChars 
            encoding:NSUTF8StringEncoding]; 

Tuttavia scanf funziona solo con programmi di console (riga di comando). Se stai cercando di ottenere input su un dispositivo Mac o iOS, scanf non è quello che desideri utilizzare per ottenere input da parte dell'utente.

+0

'Scanf' funziona con' char * '? Non voglio limitare l'input usando un array di caratteri fisso. – raffian

+0

@SAFX: sì, ma ci sono dei rischi nell'utilizzo di scanf, vedere [dettagli qui] (http://stackoverflow.com/q/2430303/154803). Ecco perché ho usato un buffer di dimensioni fisse e limitato la lunghezza in scanf. – progrmr

+0

@progrmr Forse questo è fuori moda? Ricevo 'No know class method' per la chiamata stringWithBytes. – sunny

1

sì, ma sscanf sì, e può essere una buona soluzione per l'analisi complessa NSString.

4

Ecco come lo farei:

char word [40]; 
scanf("%s",word); 

NSString * userInput = [[NSString alloc] initWithCString: word encoding: NSUTF8StringEncoding]; 
+0

NOTA: non è necessario inserire '&' Poiché la parola non è un puntatore ed è la matrice di caratteri effettiva. – ManOx

7

scanf non funziona con NSString come scanf non funziona sugli oggetti. Funziona solo su tipi di dati primitivi come:

  1. int
  2. galleggiante
  3. BOOL
  4. char

Cosa fare?

Tecnicamente una stringa è costituita da una sequenza di singoli caratteri. Quindi, per accettare l'input da stringa, puoi leggere la sequenza di caratteri e convertirla in una stringa.

uso:

[NSString stringWithCString:cstring encoding:1]; 

Ecco un esempio di lavoro:

NSLog(@"What is the first name?"); 
char cstring[40]; 
scanf("%s", cstring); 

firstName = [NSString stringWithCString:cstring encoding:1]; 

Ecco una spiegazione del codice di cui sopra, commento di commento:

  1. dichiarare una CString variabile chiamata contenere 40 caratteri.
  2. Quindi si dice a scanf di aspettarsi un elenco di caratteri usando l'identificatore di formato% s.
  3. Infine, si crea un oggetto NSString dalla lista di caratteri che sono stati letti in

eseguire il progetto.; se inserisci una parola e premi Invio, il programma dovrebbe stampare la stessa parola che hai digitato. Assicurati solo che la parola abbia meno di 40 caratteri; se entri di più, potresti causare il crash del programma: sei libero di provarlo tu stesso!:]

Tratto da: RW.

+2

Probabilmente è meglio capire se si usa 'NSUTF8StringEncoding' come opzione di codifica, non come' 1'. –

+0

Come gestire la nuova linea e gli spazi bianchi? – anoop4real

0

Simple Solution è

char word[40]; 
scanf("%39s", word); 
NSString* word2 = [NSString stringWithUTF8String:word]; 
1

Forse questo sarà il lavoro per voi, perché accetta stringa con spazi pure.

NSLog(@"Enter The Name Of State"); 
char name[20]; 
gets(name); 
NSLog(@"%s",name); 
0

La classe NSFileHandle è un wrapper orientato agli oggetti per un descrittore di file. Per i file, puoi leggere, scrivere e cercare all'interno del file.

NSFileHandle *inputFile = [NSFileHandle fileHandleWithStandardInput]; 
NSData *inputData = [inputFile availableData]; 
NSString *word = [[NSString alloc]initWithData:inputData encoding:NSUTF8StringEncoding];