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

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

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

BeitragDo, Nov 03, 2011 1:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Nov 03, 2011 1:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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) Wink

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

BeitragDo, Nov 03, 2011 1:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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;
}
 

CO2

ehemals "SirMO"

BeitragDo, Nov 03, 2011 3:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Embarassed Ich danke trotzdem

@ 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 Very Happy

EDIT:
Habs rausgekriegt, ganz ohne zeiger Very Happy Hier der Code:
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

BeitragDo, Nov 03, 2011 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hehe ok, deine Lösung ist schöner zum Lesen Wink

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 Smile


PS: Der Code von Macintosh ist übrigens mehr oder weniger der gleiche, nur in Kurzfassung.
 

CO2

ehemals "SirMO"

BeitragDo, Nov 03, 2011 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Hehe ok, deine Lösung ist schöner zum Lesen
- Danke Wink

Ok, nun habe ich den Code verstanden Wink Danke nochmal Very Happy

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

hamZta

Administrator

BeitragSa, Nov 05, 2011 15:06
Antworten mit Zitat
Benutzer-Profile anzeigen
CO2 hat Folgendes geschrieben:
Habs rausgekriegt, ganz ohne zeiger Very Happy


Just so you know, "Arrays" in C sind auch nur Zeiger.
Blog.
 

Macintosh

BeitragSo, Nov 06, 2011 3:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber mit pointer ist es schneller als wenn man bei nem array über den index geht ;)

Noobody

BeitragSo, Nov 06, 2011 9:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Macintosh hat Folgendes geschrieben:
Aber mit pointer ist es schneller als wenn man bei nem array über den index geht Wink

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

BeitragDi, Nov 08, 2011 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group