C Array Leerzeichen überprüfung

NephTis

Captain
Registriert
Apr. 2007
Beiträge
3.278
Code:
int main()
{ 
int i, j;
char zahlenreihe[]="drei fuenf zwei sieben drei zwei";

// Ausgabe des kompletten Arrays zahlenreihe
printf("%s", &zahlenreihe[0]); 

[COLOR="Red"]// Ausgabe jedes Wortes mit Leerzeile
for (j=0; j<=100; j++)
{
printf("%c", zahlenreihe[i]);
if (zahlenreihe[i] = ' ');
	printf("\n");
}
}[/COLOR]

Das komplette Array hintereinander ausgeben funktioniert schon mal. :D

Nun meine Frage:
Jedes Wort aus dem Array soll nun im nächsten Schritt in einer neuen Zeile stehen. Heißt wenn ein Leerzeichen kommt, soll er das nächste Wort in der nächsten Zeile ausgeben. Soll natürlich auch noch funktionieren, wenn ich irgendwelche anderen Wörter in Array schreibe. Wie frage ich das mit dem Leerzeichen ab. Mit einer If-Abfrage oder nicht?

Also z.B.
drei
fuenf
zwei
sieben
drei
zwei

und nicht: drei fuenf zwei sieben drei zwei
 
...

Für die For-Schleife nutzt du j=0; j<=100; j++, aber in der Schleife dann ?

Code:
// Ausgabe jedes Wortes mit Leerzeile
for (i=0; i<100; i++)
{
printf("%c\n", zahlenreihe[i]);
}

Sinnvoller wäre hier übrigens ne while-Schleife. ;)
 
Zuletzt bearbeitet:
Also das was du zur Zeit machst ist total falsch. So versuchst du den Inhalt in den anderen Bereichen des Arrays auszugeben die es garnicht gibt!!!

Der Link hier sollte dir helfen: http://www.cplusplus.com/reference/clibrary/cstring/strtok/

PS: Ich poste keine Loesung da es nichts bringt.. Um es zu lernen musst du es schon selber machen und vor allen Dingen auch verstehen!
 
Zuletzt bearbeitet:
IC3HANDS schrieb:
So versuchst du den Inhalt in den anderen Bereichen des Arrays auszugeben die es garnicht gibt!
Ab i=6 wird eben nichts mehr ausgegeben sondern nur noch Zeilenumbrüche gemacht.

Wie gesagt entweder die For-Schleife anpassen, mit count(zahlenreihe) (wenns die Funktion in C gibt) oder am besten ne while-Schleife.
 
@ Adam,

stimmt, habe mir das nicht so genau angesehen. Wenn man es sich genauer ansieht, sieht man das er bei der if-Abfrage auch eine Zuweisung (=) und keinen Vergleich (==) macht!

Dazu muss er eine while-Schleife benutzen da seine Variablen alle keine feste Groeße haben.

Ach und bitte, bitte, bitte allen Variablen von Anfang an einen Wert zuweisen!
 
Mach es mit nur einer Zählvariable i (die du dann sowohl in der for-Schleife, wie auch in der if-Abfrage verwendest) und nimm als Abbruchbedingung
Code:
i<strlen(zahlenreihe)
 
@Neph

Ja genau das meine ich :)

Wenn du das nicht machst, kannst du eventuell irgendwann richtig Probleme bekommen. Und es gehoert zum ordentlichen Programmieren einfach dazu :)

Und keine Ursache, jeder hat mal angefangen ^^
 
@Adam Gontier

Was würde die while Schleife an der falschen Abbruchbedingung ändern??????

PHP:
for (j=0; j<=100; j++)

Das müsste i sein oder du änderst die Variable im array.
Und warum 100? Das array ist keine 100 zeichen lang und es kommt zum Absturz.

PHP:
printf("%s", &zahlenreihe[0]);
Das ist auch nicht schön. eher:

PHP:
printf("%s", zahlenreihe);

Und nein, eine while Schleife wäre hier nicht sinnvoller!

Da sind noch viele weitere Fehler:
es heißt ==
kein ; hinterm if ....


PHP:
int main()
    {
        int i, j;
        char zahlenreihe[]="drei fuenf zwei sieben drei zwei";

        // Ausgabe des kompletten Arrays zahlenreihe
        printf("%s\n", zahlenreihe);
     
        // Ausgabe jedes Wortes mit Leerzeile
        for (j=0; j < strlen(zahlenreihe); j++)
        {
                printf("%c", zahlenreihe[j]);
                if (zahlenreihe[j] == ' ')
                    printf("\n");
        }
        return 0;
    }
]
 
Code:
int main()
{ 
int i, j;
char zahlenreihe[]="drei fuenf zwei sieben drei zwei";
 
// Ausgabe des kompletten Arrays zahlenreihe
printf("%s", zahlenreihe); 
 
// Ausgabe jedes Wortes mit Leerzeile
for (j=0; j<strlen(zahlenreihe); j++)
{
if (zahlenreihe[j] == ' ')
	printf("\n");
else
	printf("%c", zahlenreihe[j]);
}

}
 
Zuletzt bearbeitet:
Falls das eine Schul- oder Uni-Aufgabe ist, würde ich es btw nicht mit einer Tokenizer-Funktion machen, da das im Grunde ja etwas an der Aufgabe vorbei ist, d.h. du nutzt eine Funktion, die die eigentliche Aufgabe für dich macht. Falls es nur für dich ist, ist es natürlich egal.
 
@setTrue

es ist nicht an der Aufgabe vorbei, er hat sich eben damit beschaeftigt und diese Funktion gefunden. Das ist durchaus legitim, solange er es verstanden hat was diese macht.

Davon mal ab, nimmt diese Funktion nicht die Aufgabe ab, Sie hilft nur dabei den String zu teilen.
 
Die Aufgabe ist in aller Regel aber nicht einfach das Lösen des Problems, sondern das Lösen des Problems auf einem erwarteten Weg und für alternative Wege gibt es in Schule / Uni gerne Punktabzüge. Und der erwartete Weg solcher Aufgaben ist eigentlich immer die gezielte Suche nach Whitespace-Characters und das Durchlaufen des Strings mit einer geeigneten Abbruchbedingung. Das der strtok-Aufruf über die Angabe von Separatoren und der drumherum geschachtelten Schleife ähnliches verlangt, hilft dir nicht viel, wenn der Korrektor dir trotzdem Punkte abzieht.
 
Also ich habs immer so gelernt das man alles nutzen darf was man findet, solange man erklaeren kann was passiert und wie diese Funktion funktioniert. Tut mir leid fuer dich wenn es bei dir anders war.
 
Hab meins behoben, solltest deins auch nochmal bearbeiten :) und schön mal wieder was von dir zu lesen :)
 
@all, ne bin das privat am üben bzw. meine Kenntnisse wieder am auffrischen.

Und jetzt will ich in die Königklasse aufsteigen! Zeiger/Pointer und Felder übergeben :D

Es geht darum das ich ein Feld char zeichenkette[]="eins, zwei, drei, vier, fuenf, sechs, sieben, acht, neun, null"; einer Funktion übergeben möchte, die die Werte des Feldes in richtige Zahlen umwandelt (drei = 3, fuenf = 5 etc.)
Keine Ahnung, warum unten die case's verschoben angezeigt werden. :(

Code:
#include <stdio.h>
#include <string.h>

// Funktion initialisieren
char wandle_um(char *);

int main()
{ 
char zeichenkette[]="eins, zwei, drei, vier, fuenf, sechs, sieben, acht, neun, null";

// Funktion aufrufen
wandle_um(zeichenkette);

// Ausgeben der umgewandelten Zeichenkette
printf("%s",zeichenkette);

getchar();
}

char wandle_um(char *zk)
{
	int z=0;

	for (z=0; z<=50;z++)
            if(*zk[z] == " " || *zk[z]== ",")
                z++;
	{

	switch (zk[z])
	{
		case 'eins'        : return(1); break;
		case 'zwei'       : return(2); break;
		case 'drei'		: return(3); break;
		case 'vier'		: return(4); break;
		case 'fuenf'	: return(5); break;
		case 'sechs'	: return(6); break;
		case 'sieben'	: return(7); break;
		case 'acht'	: return(8); break;
		case 'neun'      : return(9); break;
		case 'null'		: return(j0); break;
	}
}

Hier kann ich irgendwie nicht mit strtok arbeiten, bzw. es klappt nicht wegen den Zeigern? Sind die Zeiger überhaupt so richtig? Außerdem meckert mein Compiler bei case 'fuenf', 'sechs' und 'sieben' --> "Zu viele Zeichen in einer Konstante!". Darf ich nicht mehr als 4 Zeichen benutzen. Das wäre ja doof... Würde das halt gerne mal mit einer Switch Anweisung realisieren, die habe ich früher immer verdrängt.:o:o
 
IC3HANDS schrieb:
Wenn du das nicht machst, kannst du eventuell irgendwann richtig Probleme bekommen. Und es gehoert zum ordentlichen Programmieren einfach dazu :)

Ich möchte aber hinzufügen, dass es auf die Programmiersprache an kommt. Es gibt Sprachen, da ist das nicht notwendig, da die Variablen schon bei der Deklarierung initialisiert werden.

gruß
hostile
 
Switch funktioniert nur für einzelne Zahlen. Ein int z.B. sind typischerweise 4 byte (chars).

Wenn du (C-)Strings vergleichen willst: strcmp
 
Das wird ja immer gruseliger. Du solltest vielleicht erstmal bei den Basics anfangen und dir mal nen Buch durchlesen. Switch Anweisungen können in C nicht auf Strings angewendet werden, da kein generischer Stringvergleich in der Sprache vorgegeben ist. Außerdem würden die return's nicht wie von dir gedacht die Zahl ersetzen, sondern einfach nur die Funktion und zwar die ganze verlassen. Du musst wohl oder übel einen temporären Platz suchen (stack, tmp var, global var) um das Ergebnis zu erzeugen und das Ergebnis sofern gewollt wieder in deinen Ausgangsstring übertragen. Sofern Platz vorhanden ist, was in deinem Beispiel ja sein sollte. Trotzdem ist das hier alles eher keine gute Methode um sich das Programmieren beizubringen, weil durch String Manipulationen auf "unterster" Ebene oft Overflows oder BAADFOOD Pointer entstehen. Ich empfehle dir, wenn nicht unbedingt verlangt, das lieber mit std::string zu machen, da dort die nötigen Pointer Probleme zum großen Teil vermieden werden können.
 
Zuletzt bearbeitet:
Zurück
Oben