Forum: PC-Programmierung Stringabfrage verständnisproblem


von dlt (Gast)


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;
}

von Draco (Gast)


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.

von dlt (Gast)


Lesenswert?

DANKE

von GeraldB (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von GeraldB (Gast)


Lesenswert?

@ Rufus
Mein Fehler - habe die Funktionen verwechselt.

Ich meinte eigentlich die Funktion strlen

von Karl H. (kbuchegg)


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.

von GeraldB (Gast)


Lesenswert?

Natürlich ist Blödsinn strlen in den Schleifenkopf zu packen.
Man macht direkt vor der Schleife eine Zuweisung an eine 
Integer-Variable.

von Karl H. (kbuchegg)


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.

von Random .. (thorstendb) Benutzerseite


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.

von Karl H. (kbuchegg)


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;

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
Noch kein Account? Hier anmelden.