zweidimensionales array1 im zweidimensionales array2 speichern
-
Hallo Community,
ich habe ein Problem#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int i,size_t,getx=0, gety=0, setx=0,sety=0,length; char arr[257]; char namen[257][257]; char lab[257][257]; FILE *fp = fopen("labyrinthe.txt","r"); /* Teil 1: Einlesen */ printf("Lese %s\n", "labyrinthe.txt"); if(fp == NULL) { perror("labyrinthe.txt"); return 1; } for(i=0;i<6;i++) { fgets(arr,257,fp); strcpy(namen[i],arr); printf("%s", namen[i]); } fclose(fp); size_t = strlen(namen[1]); size_t=size_t-4; //length=sqrt(size_t); length =6; for(i=3;i<size_t;i++){ sety=i; //x=sqrt(size_t); lab[getx][gety]=namen[setx][sety]; // Das array Lab soll im intervall von 6 gefüllt werden // strcpy (lab[1][1],namen[1][1],9); // es soll 6x6 werte zugewiesen bekommen strcpy(lab[getx],namen); gety++; if (gety==(length)){ printf("\n %c",lab[getx][gety]); // printf("\n %c", namen[setx][sety]); gety=1; getx++; } } printf("\n%i", size_t); return 0; }
Ich will aus einer txt Strings auslesen
die txt hat in der Zeile z.b. diesen Wert
{"L3=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww"}
Das bekomme ich auch in mein Array namen[][]
Daraus soll ich folgendes zweidimensionales Array bauen.
{"wwwwww",
"wskkkw",
"wwkwsw",
"wskwww",
"wwkkzw",
"wwwwww",}
ich habe die Schleife auch so gebaut das sie erst nach dem "=" anfängt und in 6er Schritten die Werte übergeben soll.
aber leider hat mein Array lab[][] immer den Wert '0'
es muss doch möglich sein die Werte aus namen[][] in lab[][] zu beommen
Gruß Dave
-
Deine setx, sety, getx, gety haben komische Werte. Du machst eine komische Mischung aus Zuweisungen und strcpy. Deine Beschreibung, was
lab
sein soll und waslab
im Code ist, passen nicht zusammen.Einfachste Alternative (ungetestet):
const char namen[3][40]={"L1=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww", "L2=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww", "L3=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww"}; char lab[3][6][6]; int i; for(i = 0; i < 3; ++i) memcpy(lab[i], namen[i][3], 36);
Ich habe hier mal stillschweigend angenommen, dass du nicht wirklich nullterminierte Zeichenketten in deiner Zieldatenstruktur haben möchtest.
Insgesamt noch einfacher wäre es, die Daten ohne den unnötigen Zwischenpuffer direkt in
lab
einzulesen. Der Puffer dient schließlich nur dem Abschneiden des "L3=". Das können die Lesefunktionen aber auch direkt selber erledigen.P.S.: size_t ist ein etwas "ungünstiger" Variablenname. Hast du den Bezeichner mal irgendwo gesehen, aber nicht richtig verstanden?
-
Stringterminierung. Die '\0' fehlt am Ende deiner Teilstrings.
Auch solltest du size_t für einen Variablennamen nicht verwenden. Das ist unübersichtlich.
Wozu brauchst du die Variable i, wenn die einzige Verwendung ein sety=i; ist?Von den Zeilen 41 bis 43 sollten auch zu Testzwecken immer nur eine aktiv sein.
Wobei du in Zeile 42 entweder zuviele Paramter oder eine falsche Funktion hast.Der Index bei Arrays fängt in C immer bei 0 an. (Zeile 48)
Schau dir mal den Modulo-Operator % an.
-
Hmm...
das mit dem memcpy geht nicht, ich möchte lab auch nicht 3 dimensional haben.
ich komme da irgendwie nicht weiter.
Das mit size_t kann sein das ich das von einer anderen Stelle habe. Das habe ich jetzt mal in laenge geändert.
-
Dave1990 schrieb:
Hmm...
das mit dem memcpy geht nichtWarum?
, ich möchte lab auch nicht 3 dimensional haben.
Dann mach es 2D. Deine Beschreibung klang so, als hättest du mehrere 6x6-Arrays.
-
so sieht die txt aus
L3=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww L4=wwwwbwwskkkwwwkwswwskwwwwwkkswwwwwww L5=wwwbwwwskkkwwwwwswwskwwwwwkkzwwwwwww L6=wwwbwwkskkkwwwkwswwskwwwwwkkzwwwwwww L1=wwwbwwwskkkwwwkwswwskwwwwwkkzwwwwwww L2=wwwwwwwwwswkkkswwkwkwzwwwkkkwwswbkwwswkwwkkkkwkwwswwkkkwwwwwwwww
Das sind Quadratische Labyrinthe. Der Nutzer sagt jetzt 1,2,3,4,5 oder 6. Dann wird 1 der 6 ausgewählt und gelöst. Es funktioniert auch alles bis auf das Einlesen der txt.
Es soll sich bei der Auswahl auf den Namen bezogen werden,also wenn 1 ausgewählt wird soll L1 gelöst werden.
dafür wollte ich namen[][] nutzen. Um das ganze zu lösen soll einfach das ausgewählte Array namen in lab umgewandelt werden, da meine lösungsrechnung sich auf diesen aufbau bezieht{"wwwbww", "wskkkw", "wwkwsw", "wskwww", "wwkkzw", "wwwwww"}
ich hoffe jetzt ist verständlich was ich meine.
zu memcpy.
ich weiß nicht warum das nicht geht, ich kenne mich mit dieser funktion auch nicht aus
-
Dave1990 schrieb:
so sieht die txt aus
L3=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww L4=wwwwbwwskkkwwwkwswwskwwwwwkkswwwwwww L5=wwwbwwwskkkwwwwwswwskwwwwwkkzwwwwwww L6=wwwbwwkskkkwwwkwswwskwwwwwkkzwwwwwww L1=wwwbwwwskkkwwwkwswwskwwwwwkkzwwwwwww L2=wwwwwwwwwswkkkswwkwkwzwwwkkkwwswbkwwswkwwkkkkwkwwswwkkkwwwwwwwww
Das sind Quadratische Labyrinthe. Der Nutzer sagt jetzt 1,2,3,4,5 oder 6. Dann wird 1 der 6 ausgewählt und gelöst. Es funktioniert auch alles bis auf das Einlesen der txt.
Es soll sich bei der Auswahl auf den Namen bezogen werden,also wenn 1 ausgewählt wird soll L1 gelöst werden.
dafür wollte ich namen[][] nutzen. Um das ganze zu lösen soll einfach das ausgewählte Array namen in lab umgewandelt werden, da meine lösungsrechnung sich auf diesen aufbau bezieht{"wwwbww", "wskkkw", "wwkwsw", "wskwww", "wwkkzw", "wwwwww"}
ich hoffe jetzt ist verständlich was ich meine.
Dann erfüllt mein Beispiel nach kleiner Modifikation die Anforderungen. Verstehst du denn das Beispiel?
zu memcpy.
ich weiß nicht warum das nicht geht, ich kenne mich mit dieser funktion auch nicht ausWie weißt du dann, dass es nicht funktioniert? Wieso guckst du nicht einfach nach, was memcpy macht?
-
Wenn ich das Beispiel das test bekomme ich diese meldung
Warnung: Übergabe des Arguments 2 von »memcpy« erzeugt Zeiger von Ganzzahl ohne Typkonvertierung [standardmäßig aktiviert]
-
Oh, wie gesagt, war ungetestet.
namen[i]+3
oder&namen[i][3]
(je nach Geschmack) muss das heißen.Lies dir mal mehr über Felder, Zeiger und die Standardbibliothek durch. Wenn du mit 2D-Arrays werkeln möchtest, musst du fit genug sein, um solche einfachen Fehler selber beheben zu können.
-
Also ungefähr so ?
const char namenn[3][40]={"L1=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww", "L2=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww", "L3=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww"}; char labn[200][200]; int i2; for(i2=3;i2<laenge;i2++){ memcpy(&labn[getx][gety],&namenn[setx][i2],36); gety++; if (gety==(length)){ printf("\n %c",labn[getx][gety]); gety=0; getx++; } }
-
Also ungefähr so ?
Nein, überhaupt nicht. Jetzt hast du ja alles wieder eingebaut, was bei dir falsch war.
-
hmmm
aber so füllt er ja
alle werte von namenn[0] in labn[0]
und nicht
namenn[0][0 bis 5]= labn[0][0 bis 5]
namenn [0][6 bis 10]= labn[1][0 bist 5]
usw...
Ich habe mir das auch mal durchgelesen was die memcpy funktioniert
http://www.cplusplus.com/reference/cstring/memcpy/
aber irgendwie ist das momentan nicht so wie es soll
-
Wie bist du denn auf die 36 gekommen, bzw. weißt du warum du die da hingeschrieben hast?
-
36 ist die größe von
L1=..... sind ja 40 zeichen, in dem fall und ohne L1= sind es nur noch 36 Zeichen
-
Aber wieviel Zeichen willst du kopieren?
36 waren es nicht.
-
nur 6 ?
-
Also jetzt bekomme ich schonmal die richtige ausgabe
aber im Debugg Modus sehe ich das da noch viel Unsinn gemacht wirconst char namenn[3][40]={"L1=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww", "L2=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww", "L3=wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww"}; char labn[200][200]; int i2; printf("\n"); for(i2=2;i2<=laenge+1;i2++){ //for(i2 = 3; i2 < 36; ++i2){ //memcpy(&labn[0][i2], &namenn[0][i2], 36); memcpy(&labn[getx][gety],&namenn[setx][i2],6); //printf("\n%c",labn[i2][1][1]); gety++; printf("%c",labn[getx][gety]); if (gety==(length)){ printf("\n"); // printf("\n %c", namen[setx][sety]); gety=0; getx++; } }
das ist dann meine ausgabe
wwwwww wskkkw wwkwsw wskwww wwkkzw wwwwww
ich denke das reich mir auch zum weiter arbeiten, aber irgendwie füllt das programm die lab mit mehr als 6 zeichen
-
Dave1990 schrieb:
36 ist die größe von
L1=..... sind ja 40 zeichen, in dem fall und ohne L1= sind es nur noch 36 ZeichenSo so. 40-3=36?
Schreib niemals blind Code ab, ohne ihn zu verstehen. Ich habe doch extra noch
SeppJ schrieb:
Verstehst du denn das Beispiel?
gefragt. Wenn du darauf nicht antwortest, dann gehe ich erst einmal von einem "Ja" aus.
Bei mir hatte die 36 einen Sinn. Mit deinen Änderungen aber nicht mehr. Trotzdem blieb die 36.
Wir müssen hier viel früher ansetzen. Die Musterlösung war offensichtlich nicht hilfreich, weil du sie nicht verstehst. Du musst erst einmal wirklich den Ratschlag
SeppJ schrieb:
Lies dir mal mehr über Felder, Zeiger und die Standardbibliothek durch. Wenn du mit 2D-Arrays werkeln möchtest, musst du fit genug sein, um solche einfachen Fehler selber beheben zu können.
befolgen. Es macht ja keinen Sinn, etwas zu erklären, wenn du es nicht verstehst. Wenn du das gemacht hast und ein bisschen Erfahrung gesammelt hast (Mach das wirklich! Das ist kein Scherz!), dann gehst du systematisch an das Problem heran:
- Genaue Formulierung der Problemstellung: Was hat man? Was möchte man erreichen?
- Genaue Definition der nötigen Datenstrukturen.
- Formulierung des Algorithmus, wie man mit Hilfe der Datenstrukturen von der Eingabe zu der gewünschten Ausgabe kommt.Dave1990 schrieb:
aber irgendwie füllt das programm die lab mit mehr als 6 zeichen
SeppJ schrieb:
Ich habe hier mal stillschweigend angenommen, dass du nicht wirklich nullterminierte Zeichenketten in deiner Zieldatenstruktur haben möchtest.
DirkB schrieb:
Stringterminierung. Die '\0' fehlt am Ende deiner Teilstrings.
Entscheide dich, was du haben möchtest. Du mischt gerade DirkBs Tipps mit meinen. Schlag Stichworte nach, wenn du sie nicht verstehst. Gründlich!
-
ja 36 weil das
wwwwwwwskkkwwwkwswwskwwwwwkkzwwwwwww
Zeichen sind das ist aber mit 40 angegeben wegen L1= und am Ende ist immer noch \0
also 40-4 wenn du es so haben willst
ich hatte da nur einen kleinen Denkfehler
ich habe halt noch nie Werte aus einer txt geholt und dann ein Array in das andere geschoben. der Rest ist schon klar
-
Ich habe jetzt eine Lösung.
ist zwar unsauber aber ich kann damit weiter rechnen und das reicht mir auch.
-
Dave1990 schrieb:
Ich habe jetzt eine Lösung.
ist zwar unsauber aber ich kann damit weiter rechnen und das reicht mir auch.
Das finde ich nicht
, sondern
. Wenn dir unsaubere Lösungen reichen und du sogar noch damit zufrieden bist, wirst du damit später noch Probleme bekommen. Ich bin nicht hier, um dich zu erziehen, ich gebe dir diesen Kommentar nur mal so als Eigenerfahrung mit auf den Weg.