c in c++
-
joa kann man ...
std::cout << "name: " << std::setw(6) << inhalt->name << " nummer: " << std::setw(6) << inhalt->number << std::endl;kann man//copy anstelle für strncpy(strncpy nur für CHAR??) mit dem selben problem...
hmm ganz einfach ... die String-Klasse hat dafür nen operator:
std::string s1("Das ist toll!"); std::string s2 = s1;...
so ich hab noch ne frage in c gibt es //strcmp vergleicht die zeichenfolge
gibt es sowas auch für strings(nicht für char) habe nichts in büchern gefundenString-Klasse(std::string) hat auch dafür nen operator (==) ...
std::string s1("Das ist toll!"); std::string s2 = s1; if (s1 == s2) std::cout << "\"" << s1 << "\" == \"" << s2 << "\"" << std::endl;
-
Danke sehr!!!
habe schon wieder was neues...
ich bekomme die fehlermeldung
error C2451: Bedingter Ausdruck des Typs 'std::string' nicht zulässigund es wird dann dahin gezeigt...
void PhoneBook::listbook(){ while(inhalt->next == NULL) { /*diese zeile..*/ if(inhalt->name) inhalt = inhalt->next; //cout << "name: " << std::setw(6) << inhalt->name << std::endl; //cout<< " nummer: " << std::setw(6) << inhalt->number << std::endl; }}
weiß nicht wie ich das richtig machen muss...
Danke!!
-
Nja du musst schon gucken auf was er testen soll ... aber auf if (inhalt->name == "") zu testen ... was soll das bringen?
if (inhalt->name == "") /* an stelle von if (inhalt->name) */... aber wo ist der Sinn?!
-
aber ist es in c nicht so,dass es das gleiche ist?
if(inhalt->next == NULL){}
if(inhalt->next){}habe es in meinem programm jetzt geändert aber dann bekomm ich nen haufen fehler ...
error C2676: Binärer Operator '!=': 'std::string' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nichterror C2784: 'bool std::operator !=(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)': Vorlagenargument für 'const T1 *' von 'std::string' konnte nicht hergeleitet werden
error C2784: 'bool std::operator !=(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)': Vorlagenargument für 'const T1 *' von 'int' konnte nicht hergeleitet werden
error C2784: 'bool std::operator !=(const std::istream_iterator<_Ty,_Elem,_Traits,_Diff> &,const std::istream_iterator<_Ty,_Elem,_Traits,_Diff> &)': Vorlagenargument für 'const std::istream_iterator<_Ty,_Elem,_Traits,_Diff> &' von 'std::string' konnte nicht hergeleitet werden
und noch viele mehr alle zeigen auf die selbe zeile...
und die meisten auch mehrmals...
-
? Also
if(inhalt->next == NULL)würde folgendem entsprechen
if(!inhalt->next)...
Da inhalt->name aber ein std::string und kein char* (bzw. überhaupt Zeiger) ist, kannst du schlecht auf NULL prüfen. Du musst prüfen ob der string leer ist.
if (inhalt->name.empty() == true) // er ist leer! // if (inhalt->name.empty()) /* ist das selbe als wenn du auf true prüfst */...
-
danke es läuft soweit,naja es kommen keine fehler meldungen mehr...
meine Exception wirft sofort aus das es den namen schon gibt...
also mal schaun wo ich in der search den fehler eingebaut habe...DANKE!!!
-
hab schon das nächste...
void PhoneBook::insert(string name,string number){ element *eintrag; if(search(name)){ throw xinsert(); return; } inhalt->name=name; inhalt->number= number; inhalt->next = NULL; while(eintrag->next != NULL) eintrag = inhalt->next; eintrag->next = eintrag; }warum gibt er mir ne warnung aus das er eintrag nicht kennt
warning C4700: Lokale Variable 'eintrag' wurde ohne Initialisierung verwendet
-
nja das geht nicht was du da hast. Du musst "eintrag" auch auf was zeigen lassen ... momentan zeigt er ins Nirvana ...
-
aber wenn ich mit der maus auf eintrag->next gehe zeigt er mir das eintrag ein element*eintrag ist, und next element*element::next;ihm sind doch alle bekannt??
-
Ja er kennt die Variablen ... das ist klar. Aber du kannst ja nicht auf irgend eine Stelle im Speicher zeigen und erwarten das du da was verändern darfst!
-
wie kann ich das umgehen und insert liest trotzdem richtig ein?
-
Hallo zusammen,
ich finde der Container map der Standardbibliothek eignet sich ganz hervorragend für solche Aufgaben. Hoffe, dass ich keine Verweise auf std::map beim übergliegen des Themas übersehen habe. Hier meine Lösung (weitesgehend ungetestet
...// phonebook.h #ifndef __PHONEBOOK_H__ #define __PHONEBOOK_H__ #include <string> #include <map> #include <iostream> class PhoneBook { typedef unsigned int value_type; typedef std::map<std::string, value_type> container_type; container_type v; public: typedef value_type number_type; void insert(const std::string &name, number_type number); number_type getNumber(const std::string &name); std::string getName(number_type number); bool listBook(std::ostream &os); }; #endif// phonebook.cpp #include "phonebook.h" using namespace std; void PhoneBook::insert(const string &name, number_type number) { v[name] = number; } PhoneBook::number_type PhoneBook::getNumber(const string &name) { return v[name]; } string PhoneBook::getName(number_type number) { container_type::const_iterator i = v.begin(); while (i != v.end()) { if (i->second == number) return i->first; ++i; } } bool PhoneBook::listBook(ostream &os) { container_type::const_iterator i = v.begin(); while (i != v.end()) { os << i->first << ": " << i->second << endl; ++i; } }// main.cpp #include <iostream> #include <string> #include <cassert> #include "phonebook.h" using namespace std; int main() { PhoneBook v; v.insert("lucky_tux", 1234567); v.insert("Martin", 123); v.insert("P1", 124); v.insert("P2", 125); assert(v.getNumber("lucky_tux") == 1234567); assert(v.getName(1234567) == "lucky_tux"); v.listBook(cout); }Was haltet ihr von diesem Ansatz? Bin wie immer auch über negative Kritik dankbar...
Grüße Martin
-
von deinen Ganzen typedefs halte ich recht wenig ... nutz einfach durchgehen den std::size_t - Typ und fertig.
-
(D)Evil schrieb:
von deinen Ganzen typedefs halte ich recht wenig ... nutz einfach durchgehen den std::size_t - Typ und fertig.
Wie der Name ja schon sagt, ist size_t ursprünglich für Größenangaben gedacht. Deswegen könnte die Verwendung von size_t ein wenig verwirrend sein?
Danke für den Hinweis.
-
hi!
soweit ich das verstehe steht eine ähnliche lösung auf seite eins,
und soweit ich das programm verstehe sind getname und getnummer funktionen(?)die eingegebene werte an insert weiter/zurück geben(noch richtig?)
in meiner aufgabe ist es jedoch so das ich in insert namen und nummer eingeben soll,und es soll durch ein search() im insert() verhindert werden das ein name doppelt vorkommt...
mein getname() und getnummer() sind eigene funktionen die im "buch" nach einem namen bzw. einer nummer suchen, nachdem man eine nummer bzw einen namen eingegeben hat.
dann gibt es noch einen menuepunkt listbook() der die ganze liste ausgeben soll;
und noch delete_it() um einen einzelnen wert zu löschen...
natürlich gibt es auch einen konstruktor und einen dekonstruktor und eine Exception in der search(),die "werfen" soll ob ob es den namen schon gibt...in c ist das eine verkettete liste und läuft ohne probleme...
ob es sowas auch in c++ gibt weis ich nicht,da das mein erstes c++ programm werden soll...
-
Hallo,
in meiner aufgabe ist es jedoch so das ich in insert namen und nummer eingeben soll,und es soll durch ein search() im insert() verhindert werden das ein name doppelt vorkommt...
mein getname() und getnummer() sind eigene funktionen die im "buch" nach einem namen bzw. einer nummer suchen, nachdem man eine nummer bzw einen namen eingegeben hat.Map ist ein Container der STL, welcher jedem Schlüssel einen Wert zuordnet. Diese Schlüssel/Wert-Zuordnung ist eindeutig, d.h. mit der Anweisung v[wert] erzeugst du einen neuen Eintrag sofern "wert" noch nicht als Schlüssel vorhanden ist oder greifst auf den Eintrag zu wenn bereits eine Zuordnung mit "wert" stattgefunden hat.
Grüße Martin
-
Ja,ok.
aber was ist ein container?ist STL die Standardbibliothek,wenn nicht was ist STL?und was ist ein schlüssel?
LG
-
Steffi... schrieb:
Ja,ok.
aber was ist ein container?ist STL die Standardbibliothek,wenn nicht was ist STL?und was ist ein schlüssel?
LGContainer kann man sich als "Behälter" vorstellen, die Objekte (wie z.B. numerische Werte oder Zeichen) enthalten.
Die Standard Template Library (kurz STL) ist ein Teil der Standardbibliothek, welcher Container und Algorithmen bereitstellt, die typunabhängig (als Template) implementiert sind, d.h. die auf jedem beliebigen Typ arbeiten.
Es existieren verschiedene Arten von Containern. Einer von diesen ist die Map, welche aus Schlüssel und Werten besteht. Jedem Schlüssel wird ein Wert zugeordnet. Auf den Wert wird über den Schlüssel zugegriffen. Bsp. Telefonbuch: Jedem Namen wird eine Telefonnummer zugeordnet... Auf die Telefonnummer kann über den Namen zugegriffen werden.
Grüße Martin
-
Steffi... schrieb:
ist STL die Standardbibliothek,wenn nicht was ist STL?
Nein. Die STL war eine C++ Library die von HP entwickelt wurde. Teile der STL wurden in die Standard Bibliothek aufgenommen.
-
Danke an alle es läuft endlich...cu
