Anfänger: NSString filtern

CloudyofSky

Mitglied
Thread Starter
Dabei seit
04.05.2009
Beiträge
66
Reaktionspunkte
3
Hallo Zusammen,

ich versuche gerade einen String nach einem Zeichen zu durchsuchen und das Programm verabschiedet sich immer. Hier mal der Code:

Code:
        NSString *str = @"Mein 1.Text";
	for (int cc = 1; cc <= str.length; cc++){
		unichar ch = [str characterAtIndex:cc];
		if (ch == '1') NSLog(@"1 gefunden bei %d", cc);
	}

Nehme ich die Zeile mit dem characterAtIndex raus klappts ( ohne Ausgabe ) ohne Absturtz.

Hat einer von euch eine Idee?

Edit: Das @ hab ich nur beim übertragen vergessen :(


Danke und schöne Grüße, Sky.
 
Zuletzt bearbeitet:
Hallo little_pixel,

danke für die schnelle Hilfe, ich werde das gleich mal einbauen und testen. Das mit dem vergessenem @ Zeichen war keine Absicht ;-)


Danke und schöne Grüße, Sky.
 
Öhh...keine Ahnung was du gerade in deiner letzten Antwort geschrieben hast.

Aber es funktioniert super vor allem auch so wie ich es mag. Danke schön nochmal!!! *freu*


Schöne Grüße, Sky.
 
Irrgs, nee hab mich vertan, ich habe eben gesehen es gibt mit ja nur die Position und die Länge des ersten Zeichens wieder. Und ich kann ihm dann keine neue Startposition geben. So das wenn ich wissen will wie oft ein(e) Zeichen/Zeichenkette vorkommt diese Funktion nicht benutzen kann :-(

Hast du dafür ggf eine andere Idee?


Schöne Grüße, Sky.
 
Wenn Du die Position hast, dann suchst Du ab der weiter.

> rangeOfString:eek:ptions:range:

Das Range ergibt sich dann ab dem ersten Fundling bis zum Ende.
Die Suche beginnt standardmäßig immer von links nach rechts.

Viele Grüße
 
Im Prinzip kannst Du auch ein Mutable-String erzeugen und "replaceOccurrencesOfString" verwenden.
Die Methode gibt Dir zurück, wie viele Male eine Änderung vorgenommen wurde.
Ob das brauchbar ist mußt Du selbst abwiegen.

Viele Grüße
 
Ich schätze mal du lächelst jetzt, aber ich stell mich scheinbar echt glatt an, schau mal bitte:

Code:
	NSRange myRange = [label.text rangeOfString:@"\n"];
	if (myRange.location < 1000){
		for (int cc = 0; cc < 4; cc++){
			myRange = [label.text rangeOfString:@"\n" options:NSAnchoredSearch range:myRange];
			NSLog(@"Range: %d", myRange.location);
		}
	}

label ist ein UILabel mit einem Text drin. Sinn dahinter ist das ich wissen mag wieviele Zeilenumbrüche in dem String drin sind, damit ich die Höhe berechnen kann für die Grafik dahinter. Die Abfrage wegen kleiner als 1000 ist drin, weil wenn nichts gefunden wird zeigt er mir die Zahl 2147483647 an. Und das max 4 ist, weil ich weis das es nicht mehr als 4 geben wird.
 
Es gab ja schon einige Hinweise das eleganter zu lösen.

Um den Absturz mal aufzuklären: Es ist ein Speicherzugriffsfehler:
Code:
        NSString *str = @"Mein 1.Text";
	for (int cc = 1; cc <= str.length; cc++){
		unichar ch = [str characterAtIndex:cc];
		if (ch == '1') NSLog(@"1 gefunden bei %d", cc);
	}

Du zählst von 1 bis str.length, das muss ja knallen.
In der Informatik hat es sich eingebürgert bei 0 mit dem zählen zu beginnen, d.h. hier:

1. Verpasst Du damit das Zeichen an der ersten Stelle ( characterAtIndex: 0 ), aber was den Absturz auslöst ist
2. str.length ist außerhalb des Speicherbereiches deines Strings

Bsp.: "Mein 1.Text" hat 11 Zeichen. str.length gibt dir also 11 zurück.
Code:
[str characterAtIndex: 11]
gibt es aber nicht, denn der letzte Buchstabe Deines Strings liegt an der Stelle 10 im Speicher.

Auf jeden Fall solltest Du bei 0 anfangen zu zählen und dann nur bis str.length-1, also entweder:
Code:
for( int cc = 0; cc < str.length; cc++ )
oder
Code:
for( int cc = 0; cc <= str.length-1; cc++ )
Ist Geschmackssache. Sollte aber auch Teil jedes Programmierbuches-/tutorials sein!
 
Zuletzt bearbeitet:
Geht einfacher mit:

Code:
		NSString *sourceString = @"Das ist ein \n Text \n Blub.... \n sfdfdf";
		NSInteger tmp = [[sourceString componentsSeparatedByString:@"\n"] count];
		NSLog(@"%d", tmp);

Viele Grüße
 
Ohh man, sorry für meine Dummheit. Ich danke euch beiden für die super nette Hilfe.


Schöne Grüße, Sky.
 
Zurück
Oben Unten