Stringabfrage verständnisproblem

Gast #1439227
Lesenswert?

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;
}
Gast #1439234
Lesenswert?

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.
Persönliche Seite #1441686
Lesenswert?

> 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.
#1441985
Lesenswert?

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.
#1444525
Lesenswert?

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.
Persönliche Seite #1444529
Lesenswert?

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.
#1444546
Lesenswert?

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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren