Schrift
[thread]1108[/thread]

Position eines Zeichens bestimmen



<< >> 8 Einträge, 1 Seite
renee
 2004-05-05 10:54
#10946 #10946
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wie muss eine Methode aussehen, die ein Zeichen in einem String findet und die Position zurückgibt (oder einen Zeiger darauf). Dabei sollen keine Bibliotheksfunktionen benutzt werden...

Ich habe bisher folgendes:
Code: (dl )
1
2
3
4
5
6
7
char* findchar(char *string, char zeichen){
char *position = string;
while(*position != zeichen){
*position++;
}
return position;
}


Aber das liefert mir den gesamten Teil ab dem Zeichen und nicht die Position :-(

Der Aufruf soll dann so aussehen:
Code: (dl )
findchar("HALLO:53456",':');
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Ronnie
 2004-05-05 11:17
#10947 #10947
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Ist nicht meine Welt, aber folgender Ansatz:
1. Stelle die Länge des Strings fest.
2. Stopf den String in ein Array of Chars
3. Iteriere über die Elemente des arrays mit einer for-Schleife (index++)
4. Wenn das Element gleich dem gesuchten zeichen ist gib den index zurück

Gruss,
Ronnie\n\n

<!--EDIT|Ronnie|1083741468-->
renee
 2004-05-05 11:58
#10948 #10948
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
sorry, habe vergessen zu sagen, dass
Quote
char* findchar(char *string, char zeichen){}
vom Dozenten vorgegeben war. Wenn es aber keine Lösung gibt, werde ich es wohl mit dem Index machen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ptk
 2004-05-05 12:40
#10949 #10949
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Versuch es mal mit
Code: (dl )
return position - string
.
Crian
 2004-05-05 13:21
#10950 #10950
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
[quote=Ronnie,05.05.2004, 09:17]Ist nicht meine Welt, aber folgender Ansatz:
1. Stelle die Länge des Strings fest.
2. Stopf den String in ein Array of Chars
3. Iteriere über die Elemente des arrays mit einer for-Schleife (index++)
4. Wenn das Element gleich dem gesuchten zeichen ist gib den index zurück

Gruss,
Ronnie[/quote]
Ein String ist so etwas wie ein Array of Chars ;)

Und Renees Ansatz ist schon der C-Weg, das Problem zu lösen.


[quote=ptk,05.05.2004, 10:40]Versuch es mal mit
Code: (dl )
return position - string
.[/quote]
Genau das wollte ich auch schreiben :)
Sollte eigentlich tun was Du wünschst, berichte doch mal.

[quote=renee,05.05.2004, 08:54]und die Position zurückgibt (oder einen Zeiger darauf)[/quote]
Für einen Zeiger darauf hast Du schon die Lösung (klar siehst Du beim printen dann den Reststring, halt bis zur nächsten \0). Für Position siehe oben.


Für Produktionscode ist mir da noch zu wenig const in Deiner Funktion ...

Die Schnittstelle könnte z.B. auch

Code: (dl )
const char * findezeichen(char const * const string, const char zeichen)


lauten.\n\n

<!--EDIT|Crian|1083749473-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ronald
 2004-05-05 15:07
#10951 #10951
User since
2003-08-15
76 Artikel
BenutzerIn
[default_avatar]
[quote=renee,05.05.2004, 08:54]Wie muss eine Methode aussehen, die ein Zeichen in einem String findet und die Position zurückgibt (oder einen Zeiger darauf). Dabei sollen keine Bibliotheksfunktionen benutzt werden...

Ich habe bisher folgendes:
Code: (dl )
1
2
3
4
5
6
7
char* findchar(char *string, char zeichen){
char *position = string;
while(*position != zeichen){
*position++;
}
return position;
}


Aber das liefert mir den gesamten Teil ab dem Zeichen und nicht die Position :-(

Der Aufruf soll dann so aussehen:
Code: (dl )
findchar("HALLO:53456",':');
[/quote]
In deiner Frage suchst du nach 2 Dingen:
1. die Position auf das erste Zeichen
2. einen Zeiger auf diese Position

Deine Funktion liefert dir einen Zeiger auf diese Position (was du ja überprüft hast).

Falls du die Position willst (also den Index), dann kannst du z.B.
Code: (dl )
printf("Position: %d\n", findchar(string, ':') - string); // plus/minus Eins

verwenden. (Ich befürchte, die C-Programmierer sind begeistert).

Noch eine Frage:

Was passiert, wenn das Zeichen nicht vorkommt? Deine Funktion sucht dann den kompletten Arbeitsspeicher ab!

Also:
Besser wäre z.b. folgendes:
Code: (dl )
1
2
3
4
5
while (*position) { // suche bis zum NULL-Byte
if (*position == zeichen) return(position); // gefunden->fertig
position++;
}
return(NULL); // nicht gefunden -> NULL

untested\n\n

<!--EDIT|ronald|1083836396-->
Ronnie
 2004-05-05 18:19
#10952 #10952
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=Crian,05.05.2004, 11:21]Und Renees Ansatz ist schon der C-Weg, das Problem zu lösen.[/quote]
Wenn ich das so sehe, bin ich sehr zufrieden diesen Weg vor ein paar Jahren verlassen zu haben. In C habe ich immer viel zu sehr mit der Sprache gekämpft, als das ich ernsthaft Probleme gelöst hätte.
esskar
 2004-05-05 21:13
#10953 #10953
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=renee,05.05.2004, 09:58]sorry, habe vergessen zu sagen, dass
Quote
char* findchar(char *string, char zeichen){}
vom Dozenten vorgegeben war. Wenn es aber keine Lösung gibt, werde ich es wohl mit dem Index machen...[/quote]
hi...

wenn das so ist, dann stimmt deine erste Lösung;
würde sie aber noch sicher machen, weil wenn das zeichen nicht
enthalten ist, dann knallts;

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char* findchar(char *string, char zeichen)
{
char *position = NULL;
while(*string)
{
if(*string == zeichen)
{
position = string;
break;
}
string++;
}
return position;
}


voll und ganz und ist quasi ein äquivalent zu

Code: (dl )
char *strchr( const char *string, int c );


aus der <string.h>

--esskar
<< >> 8 Einträge, 1 Seite



View all threads created 2004-05-05 10:54.