# String -> Char (umwandeln)



## xFile (5. Dezember 2004)

Hallo.

Ich brauche eine Möglichkeit um ein "String" in eine "char-variable" umzuwandeln.

------------------------------------------------------
#include <windows.h>
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;

void main()
{
char a[20]=" ";
const char *p;
string neu;

cout<<" Alt: "<<a<<endl<<endl;
cout<<" Neu: ";
cin>>neu;

p = neu.c_str();

// und nun kein plan ?

cout<<"\n Alt: "<<a<<endl<<endl;
}
------------------------------------------------------

Ich habe nun den Inhalt aus dem "String neu" dem Zeiger "const char *p" übergeben...
doch wie bekomme ich nun den Inhalt aus dem Zeiger in die "char a[20]-Variable" ?

...oder muss ich das ganz anders angehen bzw. ist das nur ein Denkfehler von mir?


Vielen Dank


----------



## xFile (5. Dezember 2004)

Bin selber drauf gekommen...  

LÖSUNG:
------------------------------------------------------------------
#include <windows.h>
#include <iostream>
#include <string>
#include <stdio.h>
#include <conio.h>
using namespace std;

void main()
{
 char a[20]=" ";
 const char *p;
 string neu;

 cout<<" Alt: "<<a<<endl<<endl;
 cout<<" Neu: ";
 cin>>neu;

 p = neu.c_str();
 strcpy( a, p);

 cout<<"\n Alt: "<<a<<endl<<endl;
}
------------------------------------------------------------------


----------



## Mickeyman (18. März 2006)

hi
ich hab das auch mal ausprobiert (aber im consolen wizzard, c++ 6) und es hat leider nicht geklappt.  

ich habe folgendes gemacht:
                           string Backup[1000];
                           const char *str;
                           char Zwischen;
                           for(int a=0; a<=999; a++) {Backup[a]="";}
                           for(int a=0; a<=999; a++)
                              {
                                 if(!feof(Datei))
                                    {
                                       fread(&Zwischen, sizeof(Zwischen), 1, Datei);
                                       Backup[a]=Zwischen;
                                    }
                              }
                           fclose(Datei);
                           Datei=fopen("Register.dat", "w");
                           for(int a=0; a<=999; a++)
                              {
                                 if(Backup[a]!="")
                                    {
                                       str = Backup.c_str();
                                       strcpy( Zwischen, str);
                                       int ups = atoi(Zwischen);
                                       fwrite(&Zwischen, sizeof(Zwischen), 1, Datei);
                                    }

bei mir gab er diesen fehler aus: [C++ Error] Project1.cpp(247): E2294 Structure required on left side of . or .*
der fehler bezieht sich auf diese stelle: str = Backup.c_str();

ich hab keine ahnung was er damit meint
könnte mir bitte jemand dabei helfen?


----------



## MCoder (18. März 2006)

Da "Backup" ein Array ist, sollte das wohl eher so aussehen:

```
str = Backup[a].c_str();
```
Außerdem ist "Zwischen" nur ein einzelnes Zeichen. Der nachfolgende strcpy-Befehl dürfte also auch noch Probleme machen.

Bitte künftig die Code-Tags benutzen!

Gruß
MCoder


----------



## Mickeyman (20. März 2006)

ups,  danke.

Jetzt klappt bei mir alles.  das mit den "Zwischen" dürfte da eigentlich noch nicht einmal gestehen haben^^. Ist ja nur ein ausschnitt. Was aber die ganze sache einfacher gemacht hätte, wäre wenn ich die daten aus der datei in ein string kopieren könnte.

danke nochmal für die hilfe.

p.s. was ist eigentlich mit code-tags gemeint?


----------



## rohrbold (20. März 2006)

Dürfte ich noch ein paar Anmerkungen machen, ohne hier jemandem auf den Schlips zu treten. 
Man sollte von Funktionen wie strcpy Abstand nehmen und stattdessen nach Möglichkeit deren »sicheres« Äquivalent benutzen, wie in diesem Fall strncpy. Letzteres gibt die Länge des zu kopierenden strings mit, wodurch sich sog. Buffer Overflows verhindern lassen. Wenn jemand beispielsweise in einer Eingabe einen größeren String eingibt, als dafür Speicher alloziert wurde, kann er auf andere Speicherbereiche zugreifen. Das übt er beispielsweise solange, bis er herausbekommen hat, wo die Rücksprungadresse auf dem Stack liegt, überschreibt diese und schleust eigenen Assembler-Code ein. Schwups kann alles passieren, was böse ist. Ein korrekter Gebrauch von strncpy lautet daher:

```
char buf[1024];
strncpy(buf, input, sizeof(buf) - 1);
buf[sizeof(buf) - 1] = '\0';
```
Folgendes Funktionen sind wohl auch noch bedenkenswert:

gets() schränkt die Eingabe nicht ein, daher besser fgets() mit stdin verwenden.
strtok()
scanf(), fscanf() wegen schlechter Fehlerbehandlungen
sprintf(), besser auch hier snprintf()
Es ist also immer gut, sich einen Programmierstil anzugewöhnen, der solche Fälle berücksichtigt.

Dann sollte man in C/C++ immer int main() und nicht void main() schreiben und ein return ist zumindest unter C zwingend, also einfach ein return 0; am Ende schreiben.

Wenn man dann C++ benutzt, bindet man C Header mit einem c-Präfix und ohne Suffix ein, also statt <stdio.h> dann <cstdio>

Und zu guter letzt: die Code Tags findest Du als kleines Rautesymbol im Kopf des Editierfensters. Damit umschließt Du Quelltext, damit er ausgezeichnet und mit Festbreitenschrift ausgegeben wird.


----------

