Toon posts:

[C++] strcmp werkt niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Goed, waarschijnlijk zie ik iets heel simpels over het hoofd, maar ik kom er niet echt uit. Ik ben bezig met een soort van IRC-client onder linux. De client haalt zijn data van de server binnen als string. Nu wil ik die data gaan vergelijken om te kijken wat voor soort commando het is. Bijv, mijn IRC client krijgt 'PING' binnen en moet dan dus een 'PONG' terug gaan geven. Maar bij het vergelijken gaat het fout...

Stukje code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
try
{
  ClientSocket client_socket (host, port);
  string reply;

  try
  {
    client_socket >> reply;
    while (true)
    {
      cout << reply;
      client_socket >> reply;

      string ping = "PING";
      if (strcmp(reply, ping))
        cout << "There was a ping!\n";
    }
  }
  catch (SocketException&) {}
} 
catch (SocketException& e)
{
  cout << "Exception was caught: " << e.description() << "\n";  
}

Bij die strcmp() gaat het dus fout... de error die ik krijg is:
code:
1
2
cannot convert 'std::string' to 'const char*' for 
argument '1' to 'int strcmp(const char*, const char*)'

Ik snap dus niet waarom strcmp() niet werkt... Moet strcmp perse een char* als argumenten hebben?

[ Voor 9% gewijzigd door curry684 op 16-10-2003 10:25 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
strcmp werkt wel, jij geeft gewoon verkeerde argumenten mee.
strcmp verwacht char* of arrays van characters als argumenten, en jij geeft een string mee.

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Waarom gebruik je niet gewoon:
C++:
1
if(reply == "PING")

:?

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Verwijderd schreef op 16 oktober 2003 @ 10:24:
Moet strcmp perse een char* als argumenten hebben?
Als jij in een winkel een appel vraagt, en je krijgt een peer, heb je dan wat je gevraagd hebt?

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

whoami schreef op 16 October 2003 @ 10:26:
[...]
Als jij in een winkel een appel vraagt, en je krijgt een peer, heb je dan wat je gevraagd hebt?
Nu gebruik ik persoonlijk std::string nooit maar je zou toch verwachten dat ie operator const char*() overloaded heeft waardoor er een impliciete conversie plaats zou moeten vinden. Dat weet ik ook niet waarom dat niet werkt.

Ik weet wel dat operator == (const std::string &string) overloaded is en die veel makkelijker werkt :z

Professionele website nodig?


Verwijderd

Moet het niet zijn:

if( strcmp( ... ) == 0 )

als er geen verschil tussen de strings zit ?!

Verwijderd

Topicstarter
curry684 schreef op 16 October 2003 @ 10:26:
Waarom gebruik je niet gewoon:
C++:
1
if(reply == "PING")

:?
Mja, opzich is dat ook een oplossing... Tis nog vroeg :) Dank je

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 16 October 2003 @ 10:31:
Moet het niet zijn:

if( strcmp( ... ) == 0 )

als er geen verschil tussen de strings zit ?!
Klopt, maar we waren nog pas bij het punt dat het niet compileert dus dat boeide nog niet zoveel ;)

Professionele website nodig?


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
curry684 schreef op 16 October 2003 @ 10:28:
[...]

Nu gebruik ik persoonlijk std::string nooit maar je zou toch verwachten dat ie operator const char*() overloaded heeft waardoor er een impliciete conversie plaats zou moeten vinden. Dat weet ik ook niet waarom dat niet werkt.

Ik weet wel dat operator == (const std::string &string) overloaded is en die veel makkelijker werkt :z
Nee, operator const char* is met opzet weggelaten. Als je die conversie wil, dan heeft die een naam: const char* std::string::c_str();

Het voordeel: Bij porten heb je geen problemen met code als deze:
C++:
1
2
3
std::string Name;
//...
free(Name);

Met std::string is het een compile-time error, met andere string classes klapt dit pas runtime ( en soms op hele vreemde manieren, als zo'n string class zelf malloc() gebruikte )

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Oh ja dat c_str() verhaal kende ik nog wel idd 8)7 ;) Ik vind het zelf overigens maar een stom idee om leesbare en intuitieve code een lagere prioriteit te geven dan een port-probleem die zelden voorkomt en dan alleen nog als de porter zat en stoned is :z :+

Professionele website nodig?


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
Ik neem ook aan dat je vrij bent om std::string te subclassen en die conversie zelf te schrijven als dat nodig is. :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • SiErRa
  • Registratie: Februari 2000
  • Laatst online: 12:40
kan je niet gewoon achter je string .c_str() zetten? dan converteerd je string toch naar char*

modbreak: ander lees je ff de draad voor je blaat ;)

offtopic:
Had topic een tijdje terug geopend, maar was met een ander tabje verder gegaan, en dus gereplied en niet gerefreshed |:(

[ Voor 75% gewijzigd door curry684 op 16-10-2003 13:51 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

MSalters @ 12:31:
Nee, operator const char* is met opzet weggelaten. Als je die conversie wil, dan heeft die een naam: const char* std::string::c_str();
SiErRa @ 13:07:
kan je niet gewoon achter je string .c_str() zetten? dan converteerd je string toch naar char*
d:)b ;)

edit:
modbreak: ander lees je ff de draad voor je blaat ;)
dat dus :z :P

[ Voor 20% gewijzigd door drm op 16-10-2003 13:10 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
curry684 schreef op 16 October 2003 @ 12:42:
Oh ja dat c_str() verhaal kende ik nog wel idd 8)7 ;) Ik vind het zelf overigens maar een stom idee om leesbare en intuitieve code een lagere prioriteit te geven dan een port-probleem die zelden voorkomt en dan alleen nog als de porter zat en stoned is :z :+
Er zijn meer problemen hoor. Zo heeft een char* een heleboel pointer arithmetic operaties zoals operator+(int). En raad eens wat getc() teruggeeft? Iets wat je nu wel met + aan een std::string kunt toevoegen (conversie naar char), inplaats van iets wat misbruikt wordt om die const char* mee te verhogen (array indexering)

Impliciete conversies zijn alleen op het eerste gezicht intuitief.

[ Voor 5% gewijzigd door MSalters op 16-10-2003 18:09 ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

MSAlters : dan implementeer je toch gewoon
C++:
1
String operator +(int);


edit : nee dat werkt niet lekker, dan kan je niet meer getallen in je string opnemen met +
dus gewoon string + (char)getc()

[ Voor 42% gewijzigd door Verwijderd op 16-10-2003 21:33 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

MSalters schreef op 16 October 2003 @ 18:07:
[...]

Er zijn meer problemen hoor. Zo heeft een char* een heleboel pointer arithmetic operaties zoals operator+(int). En raad eens wat getc() teruggeeft? Iets wat je nu wel met + aan een std::string kunt toevoegen (conversie naar char), inplaats van iets wat misbruikt wordt om die const char* mee te verhogen (array indexering)
Misschien dat ik nu iets mis maar de operator+(char x) hoort hier gewoon aangeroepen te worden daar het geen impliciete conversies van het object zelf vereist en dus in ambiguity-situaties een hogere prioriteit heeft dan array-indexering op de const char*. Of ben ik nu gek? :?

Professionele website nodig?


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
Nee, je hebt gelijk. Ik zat effe te suffen. Het is een ander probleem, heeft te maken met het veranderen van het type van "strings" van char[] const naar std::string. Om dat te laten werken heb je die operator char const* nodig, en dan is het probleem dat "abc"+getc() wel gek gaat doen. (Nou ja, normaal. Nu is't gek)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1