Frage zu Arrays
-
Das ist schon klar und ich versuche ja auch alles, ist bestimmt nicht so, dass ich hier ne Lösung will, dann kann ich es auch ganz sein lassen, da der Lerneffekt = 0,0. Daher wollte ja nur Anregungen und nun habe ich ja genug und geb mich wieder dran. Werde mich melden wenn es klappt, oder erneut Prohbs auftreten!
DANKE für deine Hilfe!
-
So ich habe jetzt erstmal umgestellt auf direkte Umwandlung von Zeichen in buchstaben!
Das ist mein Umwandlungsabschnitt:
char* ptr=strtok(buffer,"\n\t "); do { //ptr mit morse vergleichen for (i=0; i<24; i++) if (strcmp((char*)ptr,(char*)morse[i])) { printf("%c ",alpha[i]); break; } ptr=strtok(NULL,"\n\t "); } while(ptr!=NULL);
Wenn ich jetzt das Programm starte, wirft er 20 mal A und B aus! Aber warum macht er das? Wenn ich mir den Inhalt von ptr anzeigen lasse, habe ich dort den identischen Stringinhalt wie in morse!
Kann es daran liegen, dass in ptr bei der Teilung des Strings Buffer das Leerzeichen mit auftaucht und er deswegen keinen identischen String findet?
-
Sorry, mein Fehler - strcmp() gibt 0 raus, wenn die beiden Strings übereinstimmen und das wird von if() als false interprtiert. Richtig heißt es:
if(strcmp(ptr,morse[i])==0)//btw, die Casts sind überflüssig ...
PS: übrigens behandelst du durch das strtok() alle Trennzeichen im Eingabestring identisch - also müsstest du dir eine Sonderbehandlung für den Zeilenwechsel \n überlegen, bevor strtok() ihn für dich entsorgt. Eine Möglichkeit wäre es, den String mit strspn() zu zerlegen.
-
Hmm ja werde ich noch einbinden, jedoch wirft er mir nach wie vor auch mit if(strcmp(ptr,morse[i])!=0) am Ende
A BA BAAAAAA BAAAAAAA
aus! Verstehe ich nicht so ganz! Ich versuche das jetzt mal mit nem Eingabetext und nicht mit ner txt die er einließt, vielleicht hat er damit Probleme??
-
*duck'n'run* Ich fürchte, langsam bin ich urlaubsreif. Das sollte natürlich heißen "if(strcmp(...)==0)".
-
LOL ja hatte ich schon gemerkt, jedoch zeigt er mir nun nur das letzte Zeichen des Morsecodes an und nicht den ganzen Text:-)
Aber ich nähre mich ganz langsam der Sache, kann ja nur noch mit der whileschleife von ptr zusammenhängen! Hoffe und denke ich!
-
Ich habe es
HAHA hatte nen doofen Schreibfehler drin:-) Jetzt gehe ich nur noch an die Zeilenumbrüche und gut ist! tausend dank für deine Inspiration^^
-
Ich hoffe ich kann dich nochmals nerven. Du meintest ja das ich den String mit strspn() zerlegen soll um das Problem mit den Leerzeichen bei Zeilenende in den Griff zu bekommen.
Nur hier stehe ich ja vor dem Problem, dass wenn ich nach dem Zeichen '\n' suchen lasse und es umtragen will, er mir einen bereits gelsenene Buchstaben an der Stelle wieder überschreibt.Gibt es nicht auch eine Formatierungsmöglichkeit bei der Speicherung des ptr Buffers in den Ausgabetextbuffer?
-
Sorry, aber: Ich kann mir jetzt gar nicht vorstellen, was du mir damit sagen willst. Kannst du das mal etwas genauer erläutern (am besten mit Code).
Eine Lösung wäre es noch, die Datei von vornherein zeilenweise einzulesen:
char buf[81];//sollte lang genug sein für eine Textzeile while(fgets(buf,81,infile)!=NULL) //Zeile einlesen { //zerlege Zeile per strtok() o.ä. und wandle in lesbare Zeichen um putc('\n');//Zeilenumbruch ausgeben }
-
Also ich habe versucht das über:
char* ptr=strtok(buffer,"\n\t "); do { //ptr mit morse vergleichen for (i=0; i<26; i++) if(strcmp(ptr,morse[i])==0){ Ausgabetext[j]=alpha[i]; j=j++; break;} //UMBRUCH = LEERZEICHEN ptr=strtok(NULL,"\n\t "); if (ptr==NULL) { Ausgabetext[j]=' '; j=j++; } } while(ptr!=NULL); Ausgabefunktion(Ausgabetext);
zu lösen, funktioniert aber nicht
Schade!
-
k
-
So, habe das zeilenweise Einlesen hinbekommen, jetzt habe ich nur das Problem, dass ich kein Leerzeichen an das Ende des jeweiligen Zeilenstrings hängen kann.
Wenn ichputc(' ',Ausgabetext);
benutze, schreibt er mir als Fehlermeldung
cannot convert `char*' to `FILE*' for argument `2' to `int putc(int, FILE*)'
Weiß vielleicht einer wie ich diesen Fehler beheben kann?
-
Du mußt als zweiten Parameter bei putc() keinen String angeben, sondern ein Ausgabefile (also die Datei, in die auch Ausgabefunktion() schreibt). Alternativ kannst du auch mit
strcat(Ausgabetext," ");
dein Leerzeichen anhängen.
-
also ich habe jetzt das mal mit strcat versucht, klappt aber nicht, der setzt mir immer das Leerzeichen ans Ende aller Strings, ich habe aber mal ne Ausgabe in der Schleife gemacht und daraus kann ich sehen, dass er wirklich Zeile für Zeile einließt, nur läßt sich einfach nicht ans Ende der ersten Zeile im File Ausgabetext das Leerzeichen anhängen!
Vielleicht siehst du ja den Fehler
FILE *quelle;
char buffer2[81];
quelle = fopen("f:\Morsecode.txt","r");//Zeile einlesen
while( !feof( quelle ) ) {
fgets( buffer2, sizeof(buffer2), quelle );//1. Zeile einlesen
{
Ausgabefunktion(buffer2);//zerlege Zeile per strtok()
char* ptr=strtok(buffer2,"\n\t ");do
{//ptr mit morse vergleichen
for ( i=0; i<28; i++)
if(strcmp(ptr,morse[i])==0){
Ausgabetext[j]=alpha[i];
j=j++;break;
}
strcat(Ausgabetext," ");
ptr=strtok(NULL,"\n\t ");}
while(ptr!=NULL);}
Ausgabefunktion(Ausgabetext);}
-
Du mußt das strtok() auch nicht nach jedem geparsten Zeichen aufrufen, sondern immer nur am Ende der jeweiligen Zeile.
PS: Der Ausdruck
j=j++;
ist sinnlos. Wenn du die Variable erhöhen willst, geht das entweder mitj++;
oder mitj=j+1;
, aber nicht mit einer wilden Kombination aus beidem.
-
CStoll schrieb:
PS: Der Ausdruck
j=j++;
ist sinnlos.sieht zwar doof aus, müsste aber auch gehen...
-
Nein, müsste er nicht. Wenn du Pech hast, bewirkt der Ausdruck gar nichts, weil die Zuweisung zuletzt ausgeführt wird und die Wirkung des Inkrement-Operators wieder aufhebt.
(Merke: Es ist generell nicht gut, in einem Ausdruck mehrere Nebeneffekte zu haben - besonders wenn sie die selbe Variable betreffen)
-
geht auch^^ auch wenn es nicht die schönste Wahl ist, was aber net geht, ist der anhang eines Leerzeichens:-( Egal wo ich strtok setze, kommt am schluss nur der gesamte String ohne Leerzeichen zwischen den einzelnen Zeilen raus!