2010-07-10 16 views
11

Quiero que el usuario ingrese una cadena y luego asigne la entrada a un NSString. Ahora mismo mi código es el siguiente:Usando scanf con NSStrings

NSString *word; 

scanf("%s", &word); 

Respuesta

7

scanf no funciona con cualquier tipo de objeto. Si tiene una cadena en C y desea crear un NSString a partir de ella, use -[NSString initWithBytes:length:encoding:].

+0

¿Cómo se crea una cadena c? ¿Puedes editar mi código para mostrarme cómo? – Omar

+0

Una cadena C es una matriz de caracteres, por lo que simplemente debe escribir 'char word [100]'. –

8

La función scanf lee en una cadena de C (en realidad una matriz de char), como esto:

char word[40]; 

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

Puede convertir una matriz de caracteres en NSString así:

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

Sin embargo scanf solo funciona con programas de consola (línea de comandos). Si intentas ingresar en un dispositivo Mac o iOS, Scanf no es lo que quieres usar para obtener la entrada del usuario.

+0

¿'scanf' funciona con' char * '? No quiero limitar la entrada usando una matriz de caracteres fija. – raffian

+0

@SAFX: sí, pero existen riesgos al usar scanf, consulte [detalles aquí] (http://stackoverflow.com/q/2430303/154803). Es por eso que usé un buffer de tamaño fijo y limité la longitud en scanf. – progrmr

+0

@progrmr Quizás esto esté pasado de moda? Obtengo 'No conozco el método de clase' para la llamada stringWithBytes. – sunny

1

sí, pero sscanf sí, y puede ser una buena solución para el análisis complejo de NSString.

4

Ésta es la forma en que lo haría:

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

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

NOTA: No necesita colocar '&' Dado que la palabra no es un puntero, y es la matriz de caracteres real. – ManOx

7

scanf no funciona con NSString como scanf no funciona en objetos. Funciona sólo en los tipos de datos primitivos tales como:

  1. int
  2. flotador
  3. BOOL
  4. carbón

¿Qué hacer?

Técnicamente una cadena se compone de una secuencia de caracteres individuales. Para aceptar la entrada de cadena, puede leer la secuencia de caracteres y convertirla en una cadena.

uso:

[NSString stringWithCString:cstring encoding:1]; 

Aquí es un ejemplo de trabajo:

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

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

He aquí una explicación del código anterior, comentario por el comentario:

  1. se declara una variable llamada cstring para contener 40 caracteres.
  2. Luego le dice a scanf que espere una lista de caracteres utilizando el especificador de formato% s.
  3. Por último, se crea un objeto NSString de la lista de caracteres que se leyeron en

ejecutar el proyecto.; si ingresa una palabra y pulsa Enter, el programa debería imprimir la misma palabra que escribió. Solo asegúrate de que la palabra tenga menos de 40 caracteres; si ingresa más, puede hacer que el programa se cuelgue; ¡puede probarlo usted mismo!:]

Tomado de: RW.

+2

Probablemente sea mejor entender si usa 'NSUTF8StringEncoding' como opción de codificación, no el' 1'. –

+0

¿Cómo manejar nueva línea y espacios en blanco? – anoop4real

0

solución simple es

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

Tal vez esto va a funcionar para usted ya que acepta cadena con espacios también.

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

La clase NSFileHandle es un contenedor orientado a objetos para un descriptor de archivo. Para los archivos, puede leer, escribir y buscar dentro del archivo.

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