Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » char/string Übergabe klappt nicht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
05.02.2004, 10:10 Uhr
~weasley
Gast


Hallo,

ich moechte einen string in einer Unterfunktion veraendern und an das Hauptprogramm zurückgeben. Wenn ich das wie folgt mache, hat name am Ende immer noch den Wert "iniName".

Waere fuer alle Vorschlaege dankbar.

C++:
main()
{
  char *name = "iniName";

  readNewName(name);
}

readNewName(char *name)
{
  name = "newName";
}




Bearbeitung von loddab:
cpp-Tags gesetzt

Dieser Post wurde am 05.02.2004 um 10:30 Uhr von loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.02.2004, 10:53 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


so kannst du das auf keinen fall machen....


C++:
readNewName(char *name){sprintf(name,"%s","newName");}
int main(){
  char name[]= "iniName";
  printf("Name vorher: %s\n",name);
  readNewName(name);
  printf("Name nachher: %s\n",name);
}


du musst dann aber mit buffer-overflows aufpassen...Es dürfen in diesem Fall keine Namen mit mehr als 7 Zeichen verwendet werden, an sonsten musst du dir halt entsprechend mehr speicher allokieren....
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 05.02.2004 um 10:53 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.02.2004, 12:24 Uhr
~weasley
Gast


Vielen DANK für die promte Antwort.
Darauf waere ich nicht so bald gekommen.

Offenbar kann ich die Eingangsdefinition auch

C++:
  char *name= "iniName";
  char name[7];
  char name[20]= "iniName";


deklarieren.

Ist die Version mit dem pointer besser?
Muss ich mit die char arrays mit delete wieder loeschen?


Bearbeitung von loddab:
cpp-Tags gesetzt

Dieser Post wurde am 05.02.2004 um 12:27 Uhr von loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.02.2004, 12:29 Uhr
typecast
aka loddab
(Operator)


Du musst ein array nur mit free löschen, wenn du vorher speicher mit malloc (o.ä) allokiert hast, sonst nicht. Delete benutzt man meines wissens nur in C++, aber da würdest du ja eh mit std::string arbeiten.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.02.2004, 12:30 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Ist die Version mit dem pointer besser?


das sind alles pointer...
das mit dem

C++:
char *name= "iniName";


ist so ein sonderfall weil du ja eignetlich auf was zeigst was es gar nicht gibt... der legt den speicher dafür selber an und macht da glaub ich ein const draus... Im zweifel virtual fragen...

auf jeden fall wenn du ein array erstellst ist der arrayname ein zeiger(pointer) aufs erste element der arrays....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.02.2004, 12:46 Uhr
~weasley
Gast


Gleich zwei Rueckmeldungen- toll, wird so langsam richtig interessant.
Also auch zwei Rueckfragen:

Erstens: Wie funktioniert mein kleines Beispiel vom Anfang mit std::string? (versuche mich naemlich auch in c++)

Zweitens: Sonderfall oder nicht - hat die Verwendung von *name Nachteile?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.02.2004, 12:49 Uhr
typecast
aka loddab
(Operator)


Hier mal eine Möglichkeit:

C++:
#include <string>
using std::string;
#include <iostream>
using std::cout; using std::endl;

void mach_was(string& bla)
{
  bla = "bla";
}

int main()
{
  string foo = "bar";
  cout << foo  << endl;
  mach_was(foo);
  cout << foo << endl;
}



--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)

Dieser Post wurde am 05.02.2004 um 12:50 Uhr von loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
05.02.2004, 12:50 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


mal ungetestet ins forum gehackt....

C++:
#include <iostream>
#include <string>

void readNewName(std::string &name){name="newName";}
int main(){
    std::string name="iniName";
    std::cout<<name<<std::endl;
    readNewName(name);
    std::cout<<name<<std::endl;
}




Bearbeitung:

verdammt der loddab war schneller...


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 05.02.2004 um 12:51 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
05.02.2004, 14:08 Uhr
~weasley
Gast


Nochmals danke. Das mit den strings laeuft super.

Was mich allerdings wundert ist, dass ich

#include <string>
using std::string;

in den header file in dem die Funktionsdefinition steht eintragen musste und nicht in die cpp files. Sonst hat der compiler den string nicht erkannt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
05.02.2004, 14:10 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


entweder nimmst du das so wie loddab das gemacht hat...
oder du verwendest das so

C++:
#include <iostream>
#include <string>
using namespace std;



oder du lässt den "using namespace std" weg und rufst das expliziet wie in meinem beispiel auf also std::cout und std::string usw...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 05.02.2004 um 14:10 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: