# Strings zuweisen...



## bigfella (28. Dezember 2005)

Hi.
Hab ein Problem mit der Zuweisung von Strings.
Folgender Code:

```
#include <stdio.h>
int main(void)
{
char array1[] = "Hallo";
char array2[10];

printf("\n Main: %s ", array1);
printf("\n Main: %s ", array2);

getch();
return 0;
}
```

Frage: 
Wie kann ich nun array2 den Inhalt von array1 zuweisen?
Als erstes dachte ich: 
array2 = array1; // bekam Fehlermeldung: Lvalue required
Dann habe ich einiges "ausprobiert" mit eckigen Klammern, Dereferenzieren und Adressoperator... 
Komme einfach nicht weiter.
Bin mir sicher, dass das einer von Euch weiß 
Vielen DANK


EDIT:
Habe gerade eine Lösung gefunden:

char *array1 = "Hallo";
char *array2;
array2=array1;

Dann übernimmt array2 das "Hallo" von array1.
Aber trotzdem muss es doch auch mit Arrays gehen, oder nicht?


----------



## Tobias K. (28. Dezember 2005)

moin


Schonmal von strcpy gehört?


mfg
umbrasaxum


----------



## bigfella (28. Dezember 2005)

Ja, habe ich.
Wollte diese mir aber selber schreiben und dann kam ich eben auf die Frage...
Wenn mir das jemand erklären könnte, wär klasse.


----------



## Tobias K. (28. Dezember 2005)

moin


Ist doch ganz schnell erledigt.

```
char array1[] = "Hallo";
char array2[10];

for(int i=0; i<strlen(array1); i++)
{
    array2[i] = array1[i];
    array2[i+1] = 0;
}
```
So müsste es gehen.


mfg
umbrasaxum


----------



## Dennis Wronka (29. Dezember 2005)

Sollte diese Zeile

```
array2[i+1] = 0;
```
nicht eher so aussehen:

```
array2[i+1] = (char)NULL;
```
Denn 0 ist ja nicht NULL.


----------



## Tobias K. (29. Dezember 2005)

moin


Nö,

```
array2[i+1] = 0;
```
ist schon richtig, da ich hier wirklich den Wert Null haben will.
Richtiger wäre aber wohl

```
array2[i+1] = (char)0;
```
Darauf kommt es aber nicht an.


mfg
umbrasaxum


----------



## Dennis Wronka (29. Dezember 2005)

Ach so. Ich dachte Du wolltest den String terminieren.
Ich hab in der letzten Zeit so viele Strings terminiert, das hab ich nun davon...


----------



## Tobias K. (29. Dezember 2005)

moin


Ich will in auch termninieren!
Und das "Terminierungszeichen ist nunmal das Zeichen mit dem Wert Null.


mfg
umbrasaxum


----------



## Dennis Wronka (29. Dezember 2005)

Ich hatte jetzt immer mit (char)NULL terminiert, und das hat auch wunderbar geklappt.

```
if (strlen(data)>0)
	{
		data[0]=(char)NULL;
	}
```
Wo liegt denn nun der Unterschied? Vielleicht dass ich mit Pointern arbeite und erstmal Speicher allozieren muss und hier im Beispiel mit festen Arrays gearbeitet wird?


----------



## Tobias K. (29. Dezember 2005)

moin


Ist NULL denn wirklich nicht das selbe wie 0?
Ich wüsste den Unterschied nicht!

```
if( 0 == NULL)
    std::cout<<"Geht doch ;)";
```
Bin jetzt zu faul den Compiler aufzumachen, aber ich denke es sollte ne Ausgabe kommen.


mfg
umbrasaxum


----------



## Dennis Wronka (29. Dezember 2005)

Ich dachte mir halt, dass 0 und NULL unterschiedlich seien, da NULL sonst ueberfluessig waere. 
Naja, solang es funktioniert.

Ich hab nur grad festgestellt, dass mein IF-Konstrukt mir im ValGrind-Mem-Leak-Check einen Fehler wirft.

Der gesamte Code sieht so aus:

```
data=malloc(memsize+1);
if (data==NULL)
	{
		fclose(scantmpfile);
		cl_free(node);
		return EXIT_FAILURE;
	}
if (strlen(data)>0)
	{
		data[0]=(char)NULL;
	}
```
Grund fuer "if (strlen(data)>0)" ist, dass meine Strings nach dem allozieren nicht leer waren.
ValGrind meldet mir fuer die Zeile nun folgendes:


> Conditional jump or move depends on uninitialised value(s)


Vielleicht sollte ich auf die Ueberpruefung verzichten und den String gleich pauschal terminieren.


----------



## Tobias K. (29. Dezember 2005)

moin


Sollte ja reichen das "Terminierungszeichen" ins erste Element des Strings zu packen, wenn der Speicher schon alloziert ist.


mfg
umbrasaxum


----------



## Dennis Wronka (29. Dezember 2005)

Ich denk das werd ich mal entsprechend aendern.
Muss ich nur noch versuchen zu verstehen was mir der Rest der Ausgabe von Valgrind sagen will. Es scheint sich dabei aber um Memory-Leaks zu handeln, und die will ich natuerlich nach Moeglichkeit noch loswerden. Aber falls ich da noch auf Probleme stosse werde ich dazu mal suchen und gegebenenfalls einen seperaten Thread oeffnen um nicht weiter den Thread eines anderen Users zu belasten.


----------



## deepthroat (29. Dezember 2005)

Hi.

Das Makro NULL bzw. ein Nullpointer wird immer gleich sein mit der konstanten Null (obwohl das Makro in C und in C++ etwas anders definiert ist).

Allerdings hat ein Nullpointer nicht unbedingt den Wert Null auf der Bitebene - der Compiler sorgt aber dafür das der Wert 0 beim Zuweisen in die richtige Repräsentation umgesetzt wird.

Man kann also NULL und 0 völlig beliebig austauschen. Allerdings bin ich der Meinung das man durch den Code ausdrücken sollte was man gemeint hat und da kommt mir eine Zeile wie diese komisch vor:

```
data[0] = (char)NULL;
```
Ganz einfach weil dort einem einzelnen Zeichen der Wert NULL (der ja für den Wert eines Nullpointers steht) zugewiesen wird. Es ist nicht falsch, da ja der Integer 0 korrekt in das Zeichen Nr. 0 umgerechnet werden kann, aber solche Zeilen machen mich immer misstrauisch ob der Autor da auch wirklich wußte was er da macht und ob es wirklich das war was er beabsichtigt hat.

Am günstigsten finde ich übrigens diese Variante:
	
	
	



```
data[0] = '\0';
```

Es steht direkt da was ich damit erreichen will - nämlich den String terminieren und nicht vielleicht etwa dem Pointer NULL zuweisen.

Es ist übrigens normal das valgrind da warnt wenn du strlen auf einen frisch allozierten Bereich verwendest. Es könnte ja sein, das in dem Bereich den du alloziert hast, gar keine 0 vorkommt (der String nicht terminiert ist), dann könntest du einen Segfault bekommen wenn strlen irgendwann aus dem Speicherbereich läuft.

Gruß


----------

