Hallo Forum, habe ein verständnisproblem zu folgendem code, dieser funktioniert nicht und soll mir aus einem string die anzahl der leerzeichen bestimmen, kann mir bitte jemand auf die sprünge helfen? DANKE # include <stdio.h> # include <stdlib.h> # define max 30 int main (void){ char string[max]; int i,n,leer=0; printf("Geben sie ein paar Wörter ein: "); scanf("%29s",&string); fflush(stdin); for(i=0;i<(max-1) && string[i]!='\0';i++){ if (string[i]==" ") ++leer; } n=i; printf("\nsie gaben %d Zeichen ein",n); printf("\nsie gaben %d leerZeichen ein",leer); getchar(); return EXIT_SUCCESS; }
Mindestens zwei Fehler: 1. Der Befehl scanf("%29s",&string) liest nur bis zum ersten Space. Das kann so schon mal garnicht funktioneren, da Du nur das erste Wort liest. 2. Beim Zählen müßte es "if (string[i]==' ')" heißen und nicht "if (string[i]==" ")", denn " " ist ein String. Für das einzelne Space kannst Du z.B. ' ' schreiben.
Warum benutzt du diese Konstruktion für die Ermittlung der Stringlänge? Es gibt doch die sizeof-Funktion. sizeof(string) ermittelt die Länge incl. Stringende-Zeichen.
> Warum benutzt du diese Konstruktion für die Ermittlung der Stringlänge? > Es gibt doch die sizeof-Funktion. > sizeof(string) ermittelt die Länge incl. Stringende-Zeichen. O nein. Wenn "string" als Array deklariert ist, liefert sizeof die Gesamtanzahl der Arrayelemente, ohne sich deren Inhalt anzusehen: char string[20] = "egon"; printf("%d", sizeof (string)); Das ergibt 20. Ist "string" als Pointer deklariert, dann liefert sizeof die Größe des Pointers, ebenfalls ohne diesen weiter zu untersuchen: char* string = "egon"; printf("%d", sizeof (string)); Das ergibt auf 32-Bit-Systemen 4 und auf 16-Bit-Systemen 2.
@ Rufus Mein Fehler - habe die Funktionen verwechselt. Ich meinte eigentlich die Funktion strlen
GeraldB schrieb: > @ Rufus > Mein Fehler - habe die Funktionen verwechselt. > > Ich meinte eigentlich die Funktion /strlen/ Womit sich dann die Frage stellt: Wozu? strlen kann auch nichts anderes machen, als in einer Schleife durch den String durchzugehen und Zeichen zu zählen. Womit dann die Situation entsteht, dass bei Verwendung von strlen, der String insgesamt 2 mal mit einer SChleife durchgesehen wird. Macht er es aber so wie er das hat (abzüglich der Syntaxfehler), so geht beides in einem Aufwaschen.
Natürlich ist Blödsinn strlen in den Schleifenkopf zu packen. Man macht direkt vor der Schleife eine Zuweisung an eine Integer-Variable.
GeraldB schrieb: > Natürlich ist Blödsinn strlen in den Schleifenkopf zu packen. > Man macht direkt vor der Schleife eine Zuweisung an eine > Integer-Variable. Das habe ich zu deinen Gunsten bereits angenommen :-) -> es bleiben immer noch 2 Durchläufe durch den String im Kontrast zu nur einem bei seiner Lösung.
ich würde das schleifenmässig etwas anders angehen:
1 | pString = string; |
2 | len=0; |
3 | |
4 | do
|
5 | {
|
6 | if (pString == ' ') leer++; |
7 | |
8 | // oder
|
9 | switch(*pString) |
10 | {
|
11 | case ' ': leer++; |
12 | break; |
13 | case 'a': char_a++; |
14 | break:
|
15 | default:
|
16 | break; |
17 | }
|
18 | |
19 | len++; // wenn man es irgendwo braucht ... |
20 | |
21 | } while(*pString++); |
geschmackssache :-) Und 'string' muss hier immer mit 0 enden. Aber wenn es das nicht tut, ist was anderes faul. Jedenfalls erspart man sich bei sauberer stringbehandlung einige strlen's :-) Und - man rutscht nicht über's stringende hinaus. VG, /th.
Random ... schrieb: > ich würde das schleifenmässig etwas anders angehen: > Das liefert dir ein len welches nicht mehr mit strlen übereinstimmt. Wenn man das so brauchen kann, ist es ok. Aber len muss man ja in der Schleife auch nicht hochzählen. Das kann man auch im Nachhinein berechnen:
1 | pString = string; |
2 | |
3 | leer = 0; |
4 | while( *pString ) { |
5 | if( *pString == ' ' ) |
6 | leer++; |
7 | |
8 | pString++; |
9 | }
|
10 | |
11 | len = pString - string; |
oder etwas kompakter geschrieben
1 | leer = 0; |
2 | for( pString = string; *pString; pString++ ) { |
3 | if( *pString == ' ' ) |
4 | leer++; |
5 | }
|
6 | len = pString - string; |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.