www.mikrocontroller.net

Forum: PC-Programmierung Stringabfrage verständnisproblem


Autor: dlt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dlt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE

Autor: GeraldB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: GeraldB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Rufus
Mein Fehler - habe die Funktionen verwechselt.

Ich meinte eigentlich die Funktion strlen

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: GeraldB (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich würde das schleifenmässig etwas anders angehen:
pString = string;
len=0;

do
{ 
  if (pString == ' ') leer++;

  // oder
  switch(*pString)
  {
    case ' ': leer++;
      break;
    case 'a': char_a++;
      break:
    default:
      break; 
  }
  
  len++;  // wenn man es irgendwo braucht ...

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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:
  pString = string;

  leer = 0;
  while( *pString ) {
    if( *pString == ' ' )
      leer++;

    pString++;
  }

  len = pString - string;

oder etwas kompakter geschrieben
  leer = 0;
  for( pString = string; *pString; pString++ ) {
    if( *pString == ' ' )
      leer++;
  }
  len = pString - string;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.