Seite 1 von 1

C: Frage zu arrays und strings

Verfasst: Sa Nov 24, 2012 6:31 am
von bowie_22
Hallo Zusammen,

ich versuche gerade das Themengebiet arrays, Zeiger und Strings in C möglichst gut zu verstehen und komme an einer Stelle gerade nicht weiter.
Ich wollte Folgendes auspropieren: Wie speichere ich ein paar strings in einem array? Welche Möglichkeiten gibt es?
Dazu habe ich
2 Strings definiert (str1, str2)
1 Array von char Pointern definiert --> puffer
1 Char array 4x20 definiert. --> puffer2

str1 und str2 puffer zugewiesen --> ok, Verhalten wie erwartet
Beim Versuch str1 in puffer2 zu speichern kommen meine Fragen.
Mir ist klar das str1 ein Zeiger auf das erste Element von "Auto" ist.
Deshalb ist für mich auch noch plausibel weshalb ich in puffer2 den Inhaltsoperator vorstellen muss, um Compilerfehler zu verhindern.
Mir ist auch noch kla, dass *str1 ein A ist.
Meine Fragen:
Ist mein Ansinnen so überhaupt möglich?
Wenn ja, wie müsste ich str1 in puffer2 zuweisen, dass ich bei printf("%s", puffer2[0]) nicht ASchiff bekomme, sondern Auto

Kann mir da jemand bitte weiterhelfen?

Danke!

Gruß

Marcus

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>


int main(){
	char str1[]="Auto";
	char str2[]="Schiff";
	char* puffer[]={str1,str2};
	//char puffer2[4][20]={"Flugzeug",str1,str2,"Flugzeug"};
	char puffer2[4][20]={*str1,"Schiff",
                                               ,"Auto"
						,"Frosch"
						, "Heidi"};
	
	printf("%d \n",sizeof(puffer));
	printf("%s \n",puffer[0]);
	
	printf("%d \n",sizeof(puffer2));
	printf("%s \n",puffer2[0]);

	return EXIT_SUCCESS;

}

Re: C: Frage zu arrays und strings

Verfasst: Sa Nov 24, 2012 11:53 am
von Xin
Moin bowie, wer sitzt denn um die Zeit am Samstag am Computer? ;-)
bowie_22 hat geschrieben:ich versuche gerade das Themengebiet arrays, Zeiger und Strings in C möglichst gut zu verstehen und komme an einer Stelle gerade nicht weiter.
Ich wollte Folgendes auspropieren: Wie speichere ich ein paar strings in einem array? Welche Möglichkeiten gibt es?
Dazu habe ich
2 Strings definiert (str1, str2)
1 Array von char Pointern definiert --> puffer
1 Char array 4x20 definiert. --> puffer2

str1 und str2 puffer zugewiesen --> ok, Verhalten wie erwartet
Beim Versuch str1 in puffer2 zu speichern kommen meine Fragen.
Mir ist klar das str1 ein Zeiger auf das erste Element von "Auto" ist.
Deshalb ist für mich auch noch plausibel weshalb ich in puffer2 den Inhaltsoperator vorstellen muss, um Compilerfehler zu verhindern.
Mir ist auch noch kla, dass *str1 ein A ist.
Das ist doch schonmal was...
bowie_22 hat geschrieben: Meine Fragen:
Ist mein Ansinnen so überhaupt möglich?
Ich verstehe Dein Ansinnen ehrlich gesagt nichtmals. ^^

Du müsstest einen String zuweisen, also den Pointer auf das erste Zeichen. Beim Kompilieren erhalte ich

Code: Alles auswählen

arrays.c:10: warning: initialization makes integer from pointer without a cast
arrays.c:11: error: expected expression before ‘,’ token
Das Programm ist so nicht kompilierfähig. Womit kompilierst Du das, um auf ASchiff zu kommen!?? Da ist in Zeile 10 auch ein Komma zuviel!?
Du initialisiert ein Array von char mit Informationen, die erst zur Laufzeit (also lange nach dem kompilieren zur Verfügung stehen.

Wenn überhaupt, dann kannst du das Array mit (char *) initialisieren, *str ist aber ein (char), eben besagtes 'A'. Das geht so nicht.

String sind in C so nicht wirklich unterstützt. Wenn Du also str1 schreibst, dann meinst Du den Zeiger auf das A, nicht den ganzen String, der sich hinter dem A befindet! Das ist quasi ein Integer. Ein Pointer passt nicht in ein Array von chars, was der Compiler (GCC in dem Fall) anmeckert.

Also musst Du eine Funktion aufrufen, die die ganzen chars in das Array einkopiert, denn das ist ja was Du (denke ich) willst.

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
	char str1[]="Auto";
	char str2[]="Schiff";
	char* puffer[]={str1,str2};
	//char puffer2[4][20]={"Flugzeug",str1,str2,"Flugzeug"};
	char puffer2[5][20]={ "","Schiff"
            ,"Auto"
						,"Frosch"
						, "Heidi"};
	
	strcpy( puffer2[0], str1 );
	printf("%d \n",sizeof(puffer));
	printf("%s \n",puffer[0]);
	
	printf("%d \n",sizeof(puffer2));
	printf("%s \n",puffer2[0]);

	return EXIT_SUCCESS;

}
Ich vermute, das ist, was Du gesucht hast.

Re: C: Frage zu arrays und strings

Verfasst: Mo Nov 26, 2012 6:09 am
von bowie_22
Hallo Xin,

danke für die Antwort.
Ja, in dem was ich ins Forum gestellt habe ist ein Komma zuviel. Das habe ich nacheditiert und dabei den Fehler eingebaut.
Tut mir leid.

Das mit dem strcpy war der Hinweis den ich gesucht habe. Ich komme aus einer skriptlastigen Welt (Matlab,Python) in der man "wild" mischen kann (z.B. Matlab cell array), deshalb mag mein Ansinnen etwas seltsam erscheinen.

Ich will eigentlich nur den Vorteil von puffer rausarbeiten, weil man da eben über die Pointer Geschichte str1 und str2 elegant in eben einem array verwalten kann.
Der andere Weg mit puffer2 ist

- unflexibel (was ist wenn ein char array >4 elemente hat?)
- Ressourcen fressend (man muss ja eine Kopie von str1 machen und muss einen Speichervorhalt (20) machen
- nicht elegant (man muss strcpy verwenden, um das array zu füllen)

Da ich kein C Experte bin, wollte ich das nochmal bestätigt wissen ...

Eins habe ich in Deiner Antwort allerdings noch nicht verstanden:
Du initialisiert ein Array von char mit Informationen, die erst zur Laufzeit (also lange nach dem kompilieren zur Verfügung stehen.
Kannst Du bitte nochmal beschreiben was du damit meinst?
str1 wird doch vor *str definiert und sollte doch somit (wenn auch in diesem Kontext falsch) in der Folge verwendbar sein?


Gruß

Marcus

Re: C: Frage zu arrays und strings

Verfasst: Mo Nov 26, 2012 11:35 am
von Xin
bowie_22 hat geschrieben:Das mit dem strcpy war der Hinweis den ich gesucht habe. Ich komme aus einer skriptlastigen Welt (Matlab,Python) in der man "wild" mischen kann (z.B. Matlab cell array), deshalb mag mein Ansinnen etwas seltsam erscheinen.
Eigentlich nicht... der Punkt ist vergleichsweise einfach: C ist nicht Python oder Matlab. Nur beim Initialisieren tut es gelegentlich so.
Ein Text ("Auto") wird byteweise kopiert, während ein Zeiger (str1) nunmal nur eine Zahl ist, nämlich die Adresse, wohin der Zeiger zeigt und eine solche Adresse kann man nicht in ein Char-Array kopieren. *zeiger geht auch nicht, weil Du dann auf das zugreifst, auf dass Du zeigst, was ein char ist...
bowie_22 hat geschrieben:Ich will eigentlich nur den Vorteil von puffer rausarbeiten, weil man da eben über die Pointer Geschichte str1 und str2 elegant in eben einem array verwalten kann.
Der andere Weg mit puffer2 ist

- unflexibel (was ist wenn ein char array >4 elemente hat?)
- Ressourcen fressend (man muss ja eine Kopie von str1 machen und muss einen Speichervorhalt (20) machen
- nicht elegant (man muss strcpy verwenden, um das array zu füllen)
C ist schnell. Wenn Du Geschwindigkeit und Eleganz willst, nimm C++.
bowie_22 hat geschrieben:Eins habe ich in Deiner Antwort allerdings noch nicht verstanden:
Du initialisiert ein Array von char mit Informationen, die erst zur Laufzeit (also lange nach dem kompilieren zur Verfügung stehen.
Kannst Du bitte nochmal beschreiben was du damit meinst?
str1 wird doch vor *str definiert und sollte doch somit (wenn auch in diesem Kontext falsch) in der Folge verwendbar sein?
Es war nicht schön ausgedrückt. str ist natürlich definiert, aber solange Du mit konstanten Texten arbeitest, kann C einen Block zurechtlegen, den es 1:1 in Dein Array kopieren kann. Bei den Strings (str1, str2), müsste man nachträglich nochmal drüberbügeln und das macht C nicht - zumal es die Zuweisung ja bereits ablehnt, weil ein Zeiger sich nunmal nicht in einem char-Array speichern lässt.

Du musst Dir bewusst sein, dass es in C keine Strings gibt, es gibt nur Adressen und Zahlen. Das Konzept "String" ist für C nicht existent. Wenn Du einen (char *) kopierst, dann kopierst Du nur die Adresse von einer Variable zur anderen, aber eben nicht die Daten. Möchtest Du Daten kopieren musst Du memcpy() verwenden, bzw. wenn es sich um Daten handelt, die vom Typ char sind und mit einem Nullbyte enden, dann kann strcpy() helfen. Für C sind Daten aber einfach Daten. Das Konzept String ist aber etwas, was der Mensch aus diesen Daten für sich interpretiert.

In C++ kannst Du eine Klasse String verwenden - diese kannst Du dann auch entsprechend durch Zuweisung kopieren.

Ansonsten: Ich weiß nicht, weshalb Du mehrdimensionale Arrays verwenden möchtest, aber daraus entstehen sehr klobige, unflexible Datenstrukturen. Wenn Du also nicht unbedingt klobige, unflexible Datenstrukturen brauchst, brauchst Du vielleicht was anderes ;-)

Re: C: Frage zu arrays und strings

Verfasst: Di Nov 27, 2012 6:22 pm
von bowie_22
Hallo Xin,

danke für die Antworten.
Bis bald!

Gruß

Marcus