save char array content into variable

phoolan

Grünschnabel
ich bin mir nicht sicher ob ich einfach nur auf der Leitung stehe, bitte um Hilfe.

ich habe ein char array, bsp:
char test[8] = {T,e,s,t,c,o,p,y};

wenn ich ein printf mache erhalte ich: Testcopy
soweit klar.

aber ich möchte, den inhalt, also den gesamten "Testcopy" als genau diesen in eine Variable speichern.
Damit ich diesen als gesamten content in ein zweites Array an position 2 abspeichern kann zB das dann so aussieht zb.:
char array2[8] = {0,Testcopy,2,3,4,5,6,7}

aber ich finde nichts wie ich einfach den gesamten inhalt von test array in array 2 an position 2 übertragen kann.

wenn ich es mit:
array2[2] = test;
versuche, dann erhalte ich den fehler beim compilieren: Warnung: Zuweisung erzeugt Ganzzahl von Zeiger ohne Typkonvertierung

selbiges wenn ich sage:
char variable = test;
array2[2]=variable;

bitte um einen Denkanstoß.
 
Hi

Code:
char test[8] = {T,e,s,t,c,o,p,y};
kompiliert nicht.

Falls du meinst:
Code:
char test[8] = {'T','e','s','t','c','o','p','y'};
das ist falsch.
Dass es dir dann mit printf ordentlich ausgegeben wird ist Zufall. Es fehlt die abschließene \0.
Die Folgen können beliebig sein (geht, geht nicht, stürzt ab, ändert andere Variablen...)
und auch je nach Compiler / Betriebssystem / Zeit / Inhalt der anderen Variablen etc. variieren.

Den Rest deines Beitrags versteh ich grad nicht so wirklich...
Du kannst nicht mehrere chars in eines reinstopfen.
Was willst du damit erreichen bzw. warum willst du das machen?
 
danke für die korrektur :) aber das war nur als beispiel gedacht, daher hab ich nicht so auf die richtige syntax geachtet.

mein großes problem ist, wie krieg ich den inhalt, also den gesamten jetzt in eine variable? also wenn der content des arrays syntaktisch korrekt ist :)
 
(Noch zu oben warum nicht einfach char test[9]="Testcopy"; ?
Also einfachere Stringsytnax, und natürlich passende Länge auch)

Zum neuen Beitrag:
Du kannst nicht mehrere chars in eines reinstopfen.
Was willst du damit erreichen bzw. warum willst du das machen?

edit: C oder C++? Wenn C++, warum nicht die String-Klasse?
 
das test array wird mir mit 1 zeichen pro position von meiner funktion geliefert.
ich suche ja gerade eine möglichkeit das zu konvertieren.
und genau darum gehts mir ja. ich muss aus dem stückweisen text sozusagen, einen ganzen machen, und diesen dann an eine stelle eines anderen arrays schreiben.

ich finde nur keine lösung wie ich das implementieren kann.
habs auch schon mit scanf(printf... , varialbe) probiert. klappt auch nicht ;(
 
Wie schon gesagt, es geht nicht.
Bist du dir sicher, dass beide Variablen (einfache) char-Ararys sind?

Und scanf/printf braucht man nur für Eingaben/Ausgaben, nicht fürs
Herumkopieren von Variablen (Ausnahme die s-Gruppe, aber egal)

Vielleicht einmal damit anfangen, die Aufgabe genauer zu lesen,
vielleicht hast du sie bisher nur falsch verstanden.
Du verrennst dich da in etwas, was einfach nicht geht.
 
hm ... ich habe gerade festgestellt, dass irgendwie bei einem char array pro position nur 1 zeichen stehen kann, dann funktionierts auch.

problem ist. ich muss an stelle x aber zb. 2 zeichen einfügen. in ein bestehendes array., denn wenn ich diese position ausgebe, müssen dort auch 2 zeichen angezeigt werden.

wie kann ich mehr als ein zeichen pro stelle schaffen? so dass eben an position 2 zb. "test" steht?! also jetzt generell, ohne das von einem anderen array zu übertragen, sobald es grundsätzlich mal klappt werde ich schon was finden - so hoffe ich.

anbei mein beispiel:

Code:
#include <stdio.h>
#include <stdlib.h>
int main(){
  char testarray[] = "ich bin ein test";
  printf ("content: %s", testarray);
  testarray[2] = 'test';
  printf("pos 2: %s", testarray[2]);
  return 0;
}

hier sieht man auf den screens schön, am ersten das array, und am zweiten, dass er von dem "test" was er hineinschreiben soll, nur das "t" übernimmt. ich brauche aber alles.
denn ich brauche beim zweiten prinft das "test" als output.

der schmäh ist, beim compilieren erhalte ich den fehler dass beim zweiten printf
main.c:11:3: Warnung: Format »%s« erwartet Argumenttyp »char *«, aber Argument 2 hat Typ »int« [-Wformat=]
printf("pos 2: %s", testarray[2]);
^
main.c:11:3: Warnung: Format »%s« erwartet Argumenttyp »char *«, aber Argument 2 hat Typ »int« [-Wformat=]

und wenn ich hier %s auf %d für int ändere, dann kommt auch 116 retour, anstelle meins 't'. (bild 2)


ändere ich %s nicht im zweiten print und hänge ein & vor testarray, dann erhalte ich aber "t bin ei test" anstelle des nur "t".


-> wie krieg ich mehr als ein zeichen an position 2? ... das ist meine hauptfrage eigentlich.
 

Anhänge

  • Unbenannt1.JPG
    Unbenannt1.JPG
    61,1 KB · Aufrufe: 16
  • Unbenannt.JPG
    Unbenannt.JPG
    64 KB · Aufrufe: 17
irgendwie muss es doch möglich sein in einem array pro position mehrere zeichen zu speichern.

meine alternativ idee ist leider nicht umsetzbar, daher text gelöscht.
 
ich habe gerade festgestellt, dass irgendwie bei einem char array pro position nur 1 zeichen stehen kann,
Genau...
problem ist. ich muss an stelle x aber zb. 2 zeichen einfügen. in ein bestehendes array., denn wenn ich diese position ausgebe, müssen dort auch 2 zeichen angezeigt werden.
Wie schon mehrfach gesagt geht das einfach nicht. Eine Position ist deswegen eine Position, weil da ein Zeichen steht.
Wenn jede Position im Hauptarray wieder ein Array wäre (statt ein einzelnes char) könnte man was machen, deshalb die Frage oben, ob die Typen wirklich einfache char-Arrays sind.

Und noch eine unbeantwortete Frage von oben: C oder C++?

hier sieht man auf den screens schön,
...nicht.
Dein Code testarray[2]='test'; hat implementierungsabhängiges Verhalten, da kann auch was anderes passieren (diesmal aber keine Abstürze etc., nur die Werte könnten sich unterscheiden). Und das zweite printf kompiliert nicht problemlos (wie du selbst sagst).

Noch einmal ein lästiger, aber gut gemeinter Hinweis:
Geht es langsamer an.
Du verrennst dich da ganz gewaltig in sinnlose Sachen.
Lies deine Aufgabe und die Beitrage hier genauer, lass den Code bis
morgen Abend in Ruhe und gib dir bis dahin Zeit, darüber nachzudenken.
 
Hallo phoolan,
bis ich geantwortet habe, hat sheel deine eigentliche Frage vermutlich schon beantwortet. ;)

Ich möchte dir aber gerne noch einmal die Grundlagen von C-Arrays und C-Strings erläutern, vielleicht wird dir dann klarer, was genau du falsch gemacht hast.

Wenn du schreibst
C++:
char test[8] = {T,e,s,t,c,o,p,y};
muss dir der Compiler einen Fehler ausspucken. Grund dafür ist, dass du durch
C++:
char beliebigerName[8] = IRGENDWAS;
dem Compiler mitteilst, dass du gerne ein Array, also eine Liste aus 8 Objekten vom Typ char anlegen möchtest. Zum Glück kann man heutzutage eine solche Initialisierungsliste (die geschweiften Klammern) wie du sie verwendet hast benutzen, um solche Listen/Arrays zu Füllen. Allerdings musst du dann einerseits darauf achten, dass die Liste die korrekte Länge besitzt (in deinem Fall 8 Elemente), und andererseits müssen die Objekte die du in die Liste schreibst natürlich vom dem Typ sein, den du vorne beim Array angegeben hast (bzw. sie müssen implizit zu diesem Typ konvertierbar sein).
Der Compiler versteht allerdings nicht, was T,e,s,t,c,o,p, und y sein sollen (und definitiv nicht, dass es char sein sollen). Ein char (engl. für character = Zeichen) wird in C und C++ in einfache Anführungszeichen gestellt. Wenn du z.B. schreibst
C++:
char einZeichen = a;
spuckt dir der Compiler einen Fehler aus. Schreibst du jedoch
C++:
char einZeichen = 'a';
versteht der Compiler, dass einZeichen das Zeichen a sein soll. Du müsstest also wie sheel geschrieben hat dein Array so initialisieren:
C++:
char test[8] = {'T','e','s','t','c','o','p','y'};
Damit sagst du deinem Compiler, er soll eine Liste der Zeichen T e s t c o p y anlegen. Übrigens wird test dabei zu einem (char-)Zeiger, der auf das erste Zeichen der Liste zeigt. Zum Thema Zeiger musst du dich bitte selbst schlau machen.
Ich vermute jetzt, dass du eigentlich gar nicht direkt Arrays brauchst, sondern Strings, genauer C-Strings. Die klassischen C-Strings sind im Prinzip ein char-Array. Aber jetzt stell dir doch mal schnell folgende Frage: Wenn du eine Funktion wie z.B. printf() oder scanf() schreiben müsstest, woher wüsstest du dann wann du fertig bist? Gäbe es die Möglichkeit, die Länge eines C-Arrays zu ermitteln, dann wäre die Antwort ganz einfach. Allerdings besteht ein C-Array nur aus diesem einen Zeiger. Es gibt keinerlei Information darüber, wie viele Elemente das C-Array enthält (C-Arrays werden daher auch Raw-Arrays, also rohe Arrays genannt. De facto bestehen sie nur einem "rohen Zeiger"). Die Lösung ist daher, ein Zeichen zu definieren welches für das Ende eines Strings steht, das sogenannte Nullbyte '\0' (der Backslash ist das Präfix für Byte-Notation). Und jetzt kommt genau das, was sheel gesagt hat: Möchtest du einen String Testcopy haben, musst du ihn nullterminieren:
C++:
char test[9] = {'T','e','s','t','c','o','p','y','\0'}; // Array besteht jetzt aus 9 Zeichen!
Jetzt ist test ein C-String und du kannst ihn bedenklos mit printf() ausgeben, in Dateien schreiben, und vieles mehr. :D
Anstatt jedes Mal diese komplizierte Geschichte hinzuschreiben, gibt es für die Initialisierung von C-Strings auch eine einfache Schreibweise, man setzt den String in doppelte Anführungszeichen:
C++:
char test[9] = "Testcopy";
Der String wird dabei automatisch nullterminiert. Wenn du test so definierst, besteht es aus den Zeichen 'T','e','s','t','c','o','p','y','\0' , also genau das, was wir wollten. :)

Dein eigentliches Problem ist also, dass du einen C-String in einen anderen C-String einfügen möchtest. Hierfür gibt es im Internet zahlreiche Hilfestellungen, du kannst ja mal googeln.
Du kannst natürlich auch noch einmal nachfragen, dann gebe ich dir gerne Hinweise und Tipps.

Gruß Technipion
 
Zurück