2012-04-25 9 views
8

Estoy tratando de recorrer un NSString, carácter por carácter, pero obtengo un error EXC_BAD_ACCESS. ¿Tienes una idea de cómo hacer esto, verdad? He estado buscando en Google durante horas pero no puedo entenderlo.Objective-C NSString para el ciclo con characterAtIndex

Aquí está mi código (.m):

self.textLength = [self.text length]; 

for (int position=0; position < self.textLength; position++) { 

    NSLog(@"%@", [self.text characterAtIndex:position]); 

    if ([[self.text characterAtIndex:position] isEqualToString:@"."]){ 
     NSLog(@"it's a ."); 
    } 
} 

Muchas gracias!

+1

¿Estás tratando de encontrar la posición de un personaje en particular en una cuerda? Si es así, hay una solución más fácil – Lefteris

Respuesta

28

Los caracteres no se oponen. characterAtIndex devuelve unichar, que en realidad es un tipo entero unsigned short. Debe utilizar %C en lugar de %@ en NSLog. También el carácter no es NSString, por lo que no puede enviarlo isEqualToString. Necesitará usar ch == '.' para comparar ch contra '.'.

unichar ch = [self.text characterAtIndex:position]; 
NSLog(@"%C", ch); 

if (ch == '.') {} // single quotes around dot, not double quotes 

Tenga en cuenta que, 'a' es carácter, "a" es una cadena C y @"a" es NSString. Todos son diferentes tipos.

Cuando se utiliza con %@ unichar ch en NSLog, que está tratando de imprimir un objeto desde la posición de memoria ch que es válido. Por lo tanto, obtiene un EXC_BAD_ACCESS.

+0

¡Muchas gracias por la solución, así como la gran explicación! – Linus

+0

¡Genial, gracias! Estaba usando '[NSString stringWithFormat: @"% hu "' que también causó un error. – Patrick

0

characterAtIndex: devuelve un unichar, que se declara como typedef unsigned short unichar; El especificador de formato que está utilizando en sus llamadas a NSLog son incorrectos, usted podría hacer NSLog(@"%u",[self.text characterAtIndex:position]); o NSLog(@"%C",[self.text characterAtIndex:position]); si desea que el carácter real de imprimir.

Además, como unichar se define de la manera que es, no es una cadena, por lo que no se puede comparar con otras cadenas. Pruebe algo como:

unichar textCharacter = '.'; 

if ([self.text characterAtPosition:position] == testCharacter) { 
    // do stuff 
} 
+0

¡Muchas gracias por su respuesta! – Linus

0

Si usted quiere encontrar la ubicación de un carácter en una cadena que puede utilizar esto:

NSUInteger position = [text rangeOfString:@"."].location; 

Si no se encuentra el personaje o el texto obtendrá un NSNotFound:

if(position==NSNotFound) 
    NSLog(@"text not found!"); 
+0

¡Muchas gracias por la respuesta! – Linus

Cuestiones relacionadas