Variable in eigene Funktion uebergeben

Scotty86

Mitglied
Hallo,
ich habe gestern mit C++ angefangen und bin nun auf folgendes Problem gestoßen:

Ich habe mir eine Funktion "left" geschrieben:
Code:
//Function left(your text,letters)
string left(char *buchstabe,int anz)
{
 int i = 0;
 string links;
 while (i < anz)
 {
  links = links + buchstabe[i];
  i++;
 }
return links;
}
Wenn ich nun einen Text an die Funktion uebergebe funktioniert alles.
Also:
cout << left(muh,2); (gibt mir "mu" wieder.)

Wenn ich jetzt aber eine Variable uebergeben will, kommt ein Fehler im Compiler.
Also:
string v_muh = "muh";
cout << left(v_muh,2);

Fehler:
stopcompiler.cpp: In function »int main()«:
stopcompiler.cpp:40: Fehler: keine passende Funktion für Aufruf von »left(std::string&, int)«
stopcompiler.cpp:10: Anmerkung: Kandidaten sind: std::string left(char*, int)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/ios_base.h:909: Anmerkung: std::ios_base& std::left(std::ios_base&)
stopcompiler.cpp:40: Fehler: keine passende Funktion für Aufruf von »left(std::string&, int)«
stopcompiler.cpp:10: Anmerkung: Kandidaten sind: std::string left(char*, int)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/ios_base.h:909: Anmerkung: std::ios_base& std::left(std::ios_base&)


Hab mit Google keine Loesung gefunden. Ich benutze Linux und compile mit g++.
 
Wie Du Deiner Fehlermeldung entnehmen kannst liegt der Fehler in der funktion main:

stopcompiler.cpp: In function »int main()«:

Also zeig uns mal was Du in main machst, zumindest in der Zeile 40:

stopcompiler.cpp:40: Fehler: keine passende Funktion für Aufruf von »left(std::string&, int)«

Wo der Fehler ist...
 
Um das Rätsel aufzulösen:
"string" und "char *" sind zwei unterschiedliche Sachen. Du müsstest die Variable entweder so deklarieren:
C++:
char v_muh[] = "muh";
oder du konvertierst die string-Variable:
C++:
string v_muh = "muh";
cout << left(v_muh.c_str(), 2);
Gruß
MCoder
 
Also erstmal danke fuer die Antworten.
Aber:
@MCoder:
c_str() wird nicht funktionieren, da es kein "char" sonder "const char" erstellt.
Damit koennte ich in meinem Programm die Funktion "left" also eigentlich nur einmal aufrufen, da nach dem ersten aufruf die Konstante gesetzt ist.
char v_muh[] = "muh";
wuerde zwar funktionieren, dann koennte ich mir auch die Funktion left sparen, aber ich will spaeter eine Textdatei mit mehr als 1000 Zeilen jeweils mit ca. 50 Zeichen einlesen und bearbeiten lassen, da ist die Arbeit mit stings einfacher und uebersichtlicher.

Um mein Problem zu erlaeutern hab ich ein kleines Programm geschrieben, was sich genau auf mein Problem beschaenkt.
text.cpp:
C++:
#include <iostream>
#include <string>
using namespace std;


//Function left(your text,letters)
string left(char *buchstabe,int anz)
{
 //const char *buchstabe = text.c_str();  hab ich geremt, weil mir ne Konstante net hilft
 int i = 0;
 string links;
 while (i < anz)
 {
  links = links + buchstabe[i];
  i++;
 }
 return links;
}

int main()
{
 string kuh[5];
 kuh[1] = "muh";
 kuh[2] = "muh";
 kuh[3] = "wuff";
 kuh[4] = "muh";
 kuh[5] = "ia";
 int i=1; 

 while (i<=5)
 {
  if (left(kuh[i].c_str(),1) != "m")
  {
   cout << "Kuh " << i << " hat Rinderwahn\n";
  }
  else
  {
   cout << "Kuh " << i << " ist gesund\n";
  }
  i++;
 }
}

Fehler:
test.cpp: In function »int main()«:
test.cpp:32: Fehler: ungültige Umwandlung von »const char*« in »char*«
test.cpp:32: Fehler: Argument 1 von »std::string left(char*, int)« wird initialisiert

Der Fehler ist mir klar, nur wie kann ich ihn umgehen bzw beheben?

Und noch ne kleine Verstaendnisfrage:
Wieso ist "muh" bei left("muh",2) kein string? Fuer mich war "text" immer ein String und bei anderen Sprachen hats auch nie Probleme gegeben?

Vielen Dank fuer eure Bemuehungen
scotty
 
Zuletzt bearbeitet von einem Moderator:
c_str() wird nicht funktionieren, da es kein "char" sonder "const char" erstellt.
Ja, das stimmt. Damit hast du bei deiner "left"-Funktion ein kleines Problem. Da du aber den übergebenen String nicht veränderst, kannst du den Parameter aber auch gleich als "const" deklarieren:
C++:
string left(const char *buchstabe, int anz);
Was ich nicht verstehe ist, warum du den Parameter eigentlich nicht gleich als "string" deklarierst?
C++:
string left(string buchstabe, int anz);
Damit sparst du dir irgendwelche Konvertierungen.


Damit koennte ich in meinem Programm die Funktion "left" also eigentlich nur einmal aufrufen, da nach dem ersten aufruf die Konstante gesetzt ist.
Diese Aussage kann ich nicht ganz nachvollziehen. Wo wird welche Konstante gesetzt?
Und noch ne kleine Verstaendnisfrage:
Wieso ist "muh" bei left("muh",2) kein string? Fuer mich war "text" immer ein String und bei anderen Sprachen hats auch nie Probleme gegeben?
Die Typen "char []" und "string" sind nicht dasselbe. Während ersterer einen Zeiger auf einen Speicherbereich darstellt (der die Zeichenkette aufnimmt) , ist "string" eine Klasse aus der Standardbibliothek.

Gruß
MCoder
 
Wenn ich es als String uebergebe, hab ich ja nix gewonnen? Muss ich es ja trotzdem noch in seine Buchstaben aufteilen.
C++:
string left(const char *buchstabe,int anz)
das scheint halbwegs zu funktionieren.
Allerdings ein Problem dabei. Und zwar haben die letzten beiden Kuehe immer den selben Status.
z.B.
kuh[4] = "muh";
kuh[5] = "ia";

trotzdem sind sie beide "gesund"

mach ich:
kuh[4] = "muh";
kuh[5] = "ia";
kuh[6] = "muh";

bekomme ich
gesund
krank
krank

warum?

wie nochmal mein Code:
C++:
#include <iostream>
#include <string>
using namespace std;


//Function left(your text,letters)
string left(const char *buchstabe,int anz)
{
 //const char *buchstabe = text.c_str();  hab ich geremt, weil mir ne Konstante net hilft
 int i = 0;
 string links;
 while (i < anz)
 {
  links = links + buchstabe[i];
  i++;
 }
 return links;
}

int main()
{
 string kuh[5];
 kuh[1] = "muh";
 kuh[2] = "muh";
 kuh[3] = "wuff";
 kuh[4] = "muh";
 kuh[5] = "ia";

 int i=1; 

 while (i<=5)
 {
  if (left(kuh[i].c_str(),1) != "m")
  {
   cout << "Kuh " << i << " hat Rinderwahn\n";
  }
  else
  {
   cout << "Kuh " << i << " ist gesund\n";
  }
  i++;
 }
 
Zuletzt bearbeitet von einem Moderator:
Ich glaub zwar nicht das das was mit deinem Problem zu tun hat
aber du greifst falsch auf dein Kuhfeld zu. Du mußt bei 0 anfangen
zu zählen:

Code:
string kuh[3];

kuh[0] = "muh";
kuh[1] = "ia";
kuh[2] = "wau";

Benny
 
Hi.

@Scotty86: Wirf doch mal einen Blick in die Referenz der Standard Template Library. Die Klasse std::string besitzt eine Methode namens "substr". Die liefert einen Sub-String vom aktuellen String:
C++:
string left(const string& inp, int anz) {
  return inp.substr(0, anz);
}
Außerdem müßtest du in deiner Methode noch aufpassen, das die Länge vom String mindestens anz sein muß, sonst geht's schief.

Gruß
 
Wenn ich es als String uebergebe, hab ich ja nix gewonnen? Muss ich es ja trotzdem noch in seine Buchstaben aufteilen.
Doch, damit kannst du dir einiges an Code sparen:
C++:
string left(string buchstabe, int anz)
{
    return buchstabe.substr(0, anz);
}

Das Problem mit der falschen Ausgabe liegt an deiner fehlerhaften Indexbehandlung. Eigentlich müsstest du hier schon einen Absturz kriegen:
C++:
string kuh[5];
kuh[1] = "muh";
kuh[2] = "muh";
kuh[3] = "wuff";
kuh[4] = "muh";
kuh[5] = "ia";
Du hast nur 5 Elemente definiert, machst aber Zuweisungen vom 2. bis zum 6. Element. Die Zählung der Indizes beginnt nämlich immer mit 0.
Bei deiner Auswertung greifst du dann ebenfalls auf das nicht vorhandene 6. Element zu. Damit stocherst du irgendwo im Speicher herum und das Ergebnis ist natürlich nicht vorhersehbar.

Gruß
MCoder
 
Auf die glorreiche Idee mit substr haette ich auch kommen koennen ;-)

Vielen Dank fuer eure Hilfe!
V.a. an MCoder

nur noch eins, wenn ich z.B. string muh[5]; deklariere, dann erstelle ich doch eigentlich den index 0 to 5 ? also ist 5 noch im Definitionsbereich? Oder bin ich da schon wieder fehlgeleitet?
C++ wird mir noch einige Verstaendnisprobleme bereiten :)
 
Zurück