Zählen von Leerzeichen. Wie gelingt mir das?

julianra10

Cadet 1st Year
Registriert
Okt. 2019
Beiträge
11
Hallo, ich beschäftige mich momentan mit einem Programm, das unter anderem Leerzeichen zählen soll. Eigentlich ist dies ja nicht so schwierig, ich komme im Moment allerdings dennoch nicht weiter. Anbei noch ein Ausschnitt meines bisherigen Codes. Zur Info: Es werden bei der for-Schleife immer folgende Meldungen angezeigt: "value comuted is not used" und "statement has no effect" und das Programm hängt sich dann immer auf. Davor sind noch andere Funktionen zum Einlesen des Arrays und zum Angeben einer Zahl.
Die Leerzeichen sollen in der Funktion "Leerstellen" eingelesen werden.

Wie kann ich das Programm nun zum Laufen bringen?
Danke schonmal!!

#include <iostream>
#include <stdio.h>
using namespace std;

int Kinderanzahl(int Anzahl)
{
cout <<"Geben Sie bitte ein, wie viele Kinder an dem Spiel teilnehmen."<<endl;
cin>>Anzahl;
return Anzahl;
}


char* Satzangabe(char Satz[200])
{
cout <<"Geben Sie hier bitte ein, welcher Satz verwendet werden soll."<<endl;
fflush(stdin);
fgets(Satz, 200, stdin); //fflush
return Satz;
}


int Leerstellen (char Satz[200], int Nummer)
{
int n=0;
Nummer=0;
for (Satz[n]; Satz[n<=200]; n++)
{
if ((Satz[n])==' ')
{
Nummer=Nummer+1;
}
}
Nummer=Nummer+1;
return Nummer;
}

int main()
{
int Anzahl=0;
int Nummer=0;
char Satz[200];
Anzahl=Kinderanzahl(Anzahl);
Satz[200]=*Satzangabe(Satz);
Nummer=Leerstellen(Satz, Nummer);
int Elimimieren();
return 0;
}
 
Kann den Code leider nicht lesen, weil du ihn unformatiert hier reingepostet hast.

Bitte benutze
Code:
// einen Codeblock !

Lg
 
Würde nach dem Hexadezimal-, Oktal- oder Dezimalwert vom Leerzeichen suchen.

http://www.sonderzeichen.de/ASCII/Unicode-0020.html

Code hier bitte in [code][/code]-Tags posten, es stehen sogar verschiedene Einfärbungen je nach verwendeter Sprache bereit.

cbcodeeinfügen.png
 
Code:
#include <iostream>
#include <stdio.h>

using namespace std;

int Kinderanzahl(int Anzahl)
{
    cout <<"Geben Sie bitte ein, wie viele Kinder an dem Spiel teilnehmen."<<endl;
    cin>>Anzahl;
    return Anzahl;
}

char* Satzangabe(char Satz[200])
{
    cout <<"Geben Sie hier bitte ein, welcher Satz verwendet werden soll."<<endl;
    fflush(stdin);
    fgets(Satz, 200, stdin);                                                   //fflush
    return Satz;
}

int Leerstellen (char Satz[200], int Nummer)
{
    int n=0;
    Nummer=0;
    for (Satz[n]; Satz[n<=200]; n++)
    {
        if ((Satz[n])==' ')
        {
            Nummer=Nummer+1;
        }

    }
    Nummer=Nummer+1;
    return Nummer;
}


int main()
{
    int Anzahl=0;
    int Nummer=0;
    char Satz[200];
    Anzahl=Kinderanzahl(Anzahl);
    Satz[200]=*Satzangabe(Satz);
    Nummer=Leerstellen(Satz, Nummer);
    int Elimimieren();
    return 0;
}
Ergänzung ()

Das mit dem Leerzeichen müsste ja stimmen, weil zu dieser Zeile auch kein Fehler gemeldet wird. Wie gesagt: Die Fehlermeldungen beziehen sich auf Zeile 25. Was ist aber daran falsch?
 
Und wenn man die verwendete Sprache richtig angibt, kommt sogar etwas Lesbares dabei heraus. ;)

cbcodeeinfügen2.png


C:
#include <iostream>
#include <stdio.h>

using namespace std;

int Kinderanzahl(int Anzahl)
{
    cout <<"Geben Sie bitte ein, wie viele Kinder an dem Spiel teilnehmen."<<endl;
    cin>>Anzahl;
    return Anzahl;
}

char* Satzangabe(char Satz[200])
{
    cout <<"Geben Sie hier bitte ein, welcher Satz verwendet werden soll."<<endl;
    fflush(stdin);
    fgets(Satz, 200, stdin);                                                   //fflush
    return Satz;
}

int Leerstellen (char Satz[200], int Nummer)
{
    int n=0;
    Nummer=0;
    for (Satz[n]; Satz[n<=200]; n++)
    {
        if ((Satz[n])==' ')
        {
            Nummer=Nummer+1;
        }

    }
    Nummer=Nummer+1;
    return Nummer;
}


int main()
{
    int Anzahl=0;
    int Nummer=0;
    char Satz[200];
    Anzahl=Kinderanzahl(Anzahl);
    Satz[200]=*Satzangabe(Satz);
    Nummer=Leerstellen(Satz, Nummer);
    int Elimimieren();
    return 0;
}
 
würde das ja mal mit
Code:
for (n=0; n < 200; n++) { ... }
probieren.
 
  • Gefällt mir
Reaktionen: BAGZZlash, rg88 und JJJT
Also jetzt noch einmal der gleiche Code:
C:
#include <iostream>
#include <stdio.h>

using namespace std;

int Kinderanzahl(int Anzahl)
{
    cout <<"Geben Sie bitte ein, wie viele Kinder an dem Spiel teilnehmen."<<endl;
    cin>>Anzahl;
    return Anzahl;
}

char* Satzangabe(char Satz[200])
{
    cout <<"Geben Sie hier bitte ein, welcher Satz verwendet werden soll."<<endl;
    fflush(stdin);
    fgets(Satz, 200, stdin);                                                   //fflush
    return Satz;
}

int Leerstellen (char Satz[200], int Nummer)
{
    int n=0;
    Nummer=0;
    for (Satz[n]; Satz[n<=200]; n++)
    {
        if ((Satz[n])==' ')
        {
            Nummer=Nummer+1;
        }

    }
    Nummer=Nummer+1;
    return Nummer;
}


int main()
{
    int Anzahl=0;
    int Nummer=0;
    char Satz[200];
    Anzahl=Kinderanzahl(Anzahl);
    Satz[200]=*Satzangabe(Satz);
    Nummer=Leerstellen(Satz, Nummer);
    int Elimimieren();
    return 0;
}
 
Bleibe bei meiner Aussage, auch wenn der Code jetzt bunt ist.
 
  • Gefällt mir
Reaktionen: BAGZZlash und rg88
da sind so viele Böcke drin, da weiß man gar nicht wo man anfangen soll...
besorge dir ein gutes Tutorial und gucke dir an, wie man Parameter an Funktionen übergibt, wie eine for loop aufgebaut ist (init, condition, re-init), was call by value / reference usw. usf.
du definierst Nummer implizit als Übergabe Parameter und dann in der Funktion nochmal inkl. Initalisierung auf 0.
Deine For Schleife wird beendet wenn Satz[] false ist, sicherlich nicht das was du willst.

da kann man jetzt natürlich an der Formatierung rum meckern, aber das ist doch lächerlich. Wenn man will, dann kann man auch das erste Beispiel lesen
 
  • Gefällt mir
Reaktionen: new Account()
Out of bounds an 2 Stellen

for (Satz[n]; Satz[n<=200]; n++) // <== muss 199 sein

Das hier wird auch nichts werden

char Satz[200];
Anzahl=Kinderanzahl(Anzahl);
Satz[200]=*Satzangabe(Satz);

ist doppelt falsch
- das letzte Element hat index 199 und nicht 209
- damit setzt du das 201 Element des arrays auf den Inhalt des des ersten Elements (Satz[0])
stattdessen einfach den Rückgabewert ignorieren

Du wirst eine Leerstelle zuviel zählen (außerdem ist der parameter Nummer unnötig und wird nie benutzt)

C++:
int Leerstellen (char *Satz[200])
{
  int n=0;
  int Nummer=0;
  for (Satz[n]; Satz[n< 200]; n++)
  {
     if ((Satz[n])==' ')
     {
       Nummer++;
     }
  }
  return Nummer ;     
}

C++:
int Leerstellen (const char *Satz) {
  int Anzahl == 0
  while (*Satz++) {
     if (' ' ==  *Satz) {
       Anzahl++ ;
     }
  return Anzahl ;     
}
 
@Mickey Mouse Sorry, dass ich vlt. nicht so gut programmieren kann wie du, aber die Festlegung von der Nummer auf Null brauche ich auch in der Funktion. Und "So viele Böcke" sehe ich da auch nicht. Meiner Meinung ist jetzt ja nichts mehr falsch, wenn auch evtl. für euren Standard nicht gut programmiert. Ich programmiere es halt eben so, wie wir es an der Fachhochschule gelernt haben.
 
Mit Verlaub, aber so habt ihr das bestimmt nicht an der Fachhochschule gelernt. Frage dich doch mal, wieso du bei dem Kinderanzahl-Dingens einen Parameter übergibst. Was willst du da parametrisieren? Was du an der Stelle eigentlich machen willst, ist, vom Anwender eine Eingabe zu bekommen und damit anderen Kram zu parametrisieren, aber ganz sicher nicht die Nutzereingabe selber.
 
lernt ihr dort gerade C oder C++?
Denn was du produzierst ist keines von beidem.
cloudman schrieb:
ist doppelt falsch
  • das letzte Element hat index 199 und nicht 209
  • damit setzt du das 201 Element des arrays auf den Inhalt des des ersten Elements (Satz[0])
stattdessen einfach den Rückgabewert ignorieren
dachte ich mir auch, umso erstaunlicher ist es, dass für ihn funktioniert hat ;)
 
Ja stimmt, sorry. Natürlich sehe ich ein, dass ich teilweise unnötig Sachen übergebe, die ich eigentlich nicht brauche... und der Fehler generell, den ich hier gemacht habe, leuchtet mir nun auch ein.
Und von der Namensgebung ist es auch unglücklich gewählt, weil ich an sich nicht die Leerstellen zählen will, sondern die Wörter und somit muss ich ja quasi eine Leerstelle zu viel lesen.

Vielen Dank nochmal an alle!!!!
 
Wehe, da schreibt dann einer nur ein Wort ohne Leerstellen rein ;)
Du musst schon die "Wörter" (also einmalig alles, was nicht NULL, \0 oder ein Leerzeichen ist) zählen, sonst wird das unscharf.

Schau mal hier:
 
Zuletzt bearbeitet: (einmalig ergänzt)
Ein Wort ohne Leerstellen wäre auch kein Problem, weil ich ja nun außerhalb der for-Schleife die Anzahl nochmal um eins hochzähle.
Aber danke :)
 
Noch der obligatorische Trigger-Alarm ;) wenn schon C++ (wegen <iostream> und using namespace std) dann bitte #include <string> und die gröbsten Fehler würden gar nicht erst passieren plus Code ist einfacher zu schreiben.
C++:
int Leerstellen( const std::string& Satz )
{
    int n = 0;
    for ( auto ch : Satz)
    {
        if ( ch == ' ' )
        {
            ++n;
        }
    }
    return n;
}
 
  • Gefällt mir
Reaktionen: new Account()
Ja, das wäre auch meine erste Variante gewesen. Ich habe dann aber auch die anderen Eingabemethoden ausprobiert. Danke .)
 
Wörter durch Anzahl der Leerstellen zu bestimmen ist nicht so ganz der richtige Weg.
Beispiel "Was kommt denn dabei raus, wenn man mehr ' ' als eine Leerstelle hat. Oder Komma,ohne Leerstelle"

Versuch mal etwas in der Art


C++:
// int AnzahlWoerter(const string& satz)  oder die 'C' Variante
int AnzahlWoerter(const char *satz)
{
    int anzahl = 0;
    // for (auto zeichen : satz) oder die klassische Varianten
    char zeichen ;
    while(*satz) {
        bool inWort = false;
        zeichen = *satz++;
        if (isalnum(zeichen)) {  // Solange das Zeichen ein Buchstabe / Zahl ist als Teil eines Wortes behandeln
            if (!inWort) {       // sind wir gerade in einem Wort (war der Buchstabe vorher auch alphanumeric ) ?
                 anzahl++;        // Neues Wort gefunden
                inWort = true;
            }
        }
        else
            inWort = false;
    }
    return anzahl;
}
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: lemon03

Ähnliche Themen

Zurück
Oben