[GELÖST] C Funktion zum Buchstaben zählen zählt nur bis 5?
Übersicht

CO2ehemals "SirMO"Betreff: [GELÖST] C Funktion zum Buchstaben zählen zählt nur bis 5? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
Ich wollte mal eine Funktion schreiben, die die Anzahl der Buchstaben in einem String zählt. So sieht sie bis jetzt aus: Code: [AUSKLAPPEN] #include <stdio.h>
#include <stdlib.h> int strlen(char string[]) { int x; int anzahl_buchstaben = 0; for(x = 0; x <= sizeof(string); x++) { if(string[x] <= 0 || string[x] > 127) { break; } anzahl_buchstaben++; } return anzahl_buchstaben; } int main() { char var[10] = "Peters"; printf("Anzahl der Buchstaben: %d", strlen(var)); return 0; } Ist auch ganz gut, würde sie nur weiter als bis 5 zählen... Egal was man macht, man kann alle 10 ArrayFelder beschreiben, es wird immer 5 zurückgegeben. Was läuft hier falsch? bin völlig ratlos. mfG, CO2 |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
- Zuletzt bearbeitet von CO2 am Do, Nov 03, 2011 3:26, insgesamt einmal bearbeitet
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
Die Variable string ist ein Pointer (4 Bytes) und sizeof gibt somit 4 zurück. Da dein Loop von 0 bis <= 4 geht, ist das insgesamt 5. Du könntest stattdessen einen char pointer (char*) verwenden und diesen so lange um 1 erhöhen bis du auf einen char mit dem Wert 0 triffst. Strings sind in C/C++ Null-terminiert, enden also mit 0. So in etwa (wenn ich mich nicht täusche, bin in C auch etwas eingerostet) ![]() Code: [AUSKLAPPEN] char *pointer = string; while (*char != 0) { anzahl_buchstaben++; char++; } |
||
- Zuletzt bearbeitet von Jolinah am Do, Nov 03, 2011 1:53, insgesamt einmal bearbeitet
Macintosh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
sizeof() ist ein operator der dir die größe eines datentyps zurückgibt. aber nicht die stringlänge.
so: Code: [AUSKLAPPEN] int strlen2( char str[] ) { int length = 0; while((*str++) != '\0') length++; return length; } |
||
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ICh danke erstmal für die Antworten!
@ Jolinah: Achso, Ja ok, das mit dem "string ist ein Pointer" habe ich jetzt geblickt, deinen Code allerdings noch nicht ![]() @ Macintosh: Ja, Sizeof gibt auch die Größe eines Datentypes zurück, aber in einem Array gibt es die Felder des Arrays zurück. Zitat: aber nicht die stringlänge. - dafür sollte ja auch die For-Schleife in meinem Code da sein ![]() EDIT: Habs rausgekriegt, ganz ohne zeiger ![]() Code: [AUSKLAPPEN] #include <stdio.h>
#include <stdlib.h> int strlen(char string[]) { int x; int anzahl_buchstaben = 0; for(x = 0; string[x] != '\0'; x++) { anzahl_buchstaben++; } return anzahl_buchstaben; } int main() { char var[10] = "Peterssad"; printf("Anzahl der Buchstaben: %d", strlen(var)); return 0; } mfG, CO2 |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hehe ok, deine Lösung ist schöner zum Lesen ![]() Erklärung zu meinem Code: Die Variable pointer ist wie der Name sagt ein Zeiger auf ein char. Und den lasse ich am Anfang auf das Array zeigen. Mit *char wird der Zeiger dereferenziert, das heisst man erhält den char-Wert auf den der Zeiger zeigt, am Anfang also das erste Zeichen im Array. Die While-Bedingung prüft also immer, ob das aktuelle Zeichen nicht 0 bzw. '\0' ist. In der Schleife werden die Durchgänge gezählt, aber gleichzeitig wird der Zeiger um 1 erhöht, wodurch er auf das nächste Zeichen zeigt. Hoffe das was verständlich ![]() PS: Der Code von Macintosh ist übrigens mehr oder weniger der gleiche, nur in Kurzfassung. |
||
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: Hehe ok, deine Lösung ist schöner zum Lesen - Danke ![]() Ok, nun habe ich den Code verstanden ![]() ![]() mfG, CO2 |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
![]() |
hamZtaAdministrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
CO2 hat Folgendes geschrieben: Habs rausgekriegt, ganz ohne zeiger
![]() Just so you know, "Arrays" in C sind auch nur Zeiger. |
||
Blog. |
Macintosh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Aber mit pointer ist es schneller als wenn man bei nem array über den index geht ;) | ||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Macintosh hat Folgendes geschrieben: Aber mit pointer ist es schneller als wenn man bei nem array über den index geht
![]() Nein, es passiert genau dasselbe im Hintergrund. Sie sind gleich schnell. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
Macintosh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
In "The C Programming Language" schreibt Kernighan das durch Arrays iterieren einen ticken langsamer ist.
Ich zitiere: "... Any operation that can be archived by array subscripting can also be done with pointers. The pointer version will in general be faster ..." und an einer anderen stelle begründet er auch warum.. weis aber rade nicht mehr wo. Ich glaube dem Buch ;) Doch warscheinlich hast du recht und der compiler optmiert den code das es gleich schnell ist. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group