Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage / Problem zu C++ und strings
Stoneman
04.07.2006, 20:26
Hallo,
ich habe hier ein kleines Problem, ich bekomme über eine Netzwerkverbindung mit recv ein char Array (Länge 32) rein und nun will ich dieses char Array auf bestimmte Werte überprüfen, d.h. ich will gucken, ob da nur ein a oder so drinsteht, oder ob da ein Befehl drin ist.
ich habe da schon mal was mit strcmp probiert, aber das läuft nicht so wie ich will, eigentlich gar nicht.
Mit freundlichen Grüßen
Stoneman
linux_80
04.07.2006, 21:08
Wenn Du C++ hast, kannst Du doch mit dem Typ string arbeiten, dann kann man in etwa so machen:
string strname = "hoppala";
if (strname.substr(3,1) == "a") {
// huch ein a ist da !
}
strcmp geht zwar auch, ist ansonsten für C ohne +
Stoneman
04.07.2006, 23:49
jo das ist aber eignetlich nicht das was ich suche, ich brauche etwas was mir
while ((recvMsgSize = sock->recv(echoBuffer, RCVBUFSIZE)) > 0) {
// Echo message back to client
sock->send(echoBuffer, recvMsgSize);
}
hier den vergleich erlaubt ob in echoBuffer nur ein q oder nur eine gesuchte Zeichenfolge drin steht (natürlich noch steuerzeichen), d.h.
echoBuffer = "q" -> erkennen
echoBuffer = "quer" -> nichterkennen
das klappt mit strcomp nicht, wahrscheinlich aber auch deshalb, weil ich nicht weiß, was Telnet für steuerzeichen sendet.
Mfg
Stoneman
wenn du Befehle nach einem festgelegten Protokoll suchst, kannst du das Array in einer Schleife nach dem ersten möglichen Zeichen durchsuchen, und anschließend überprüfen, ob das nächste Zeichen zum Protokoll passt. Am besten, ist natürlich bei nicht festgelegten Längen, wenn du auch noch ein Endezeichen hast.
sast
.. Telnet für steuerzeichen ..
Na, eh' das Übliche:
Mach Folgendes:
recvMsgSize = sock->recv(echoBuffer, RCVBUFSIZE))
if (!recvMsgSize) break; // da is was kaputt
while (recvMsgSize)
{
recvMsgSize--;
if echoBuffer[recvMsgSize] > 0x20) // "TRim"->letztes Zeichen KEIN steuerzeichen
break;
}
echoBuffer[recvMsgSize] = 0x00; // ein "echter" ASCIZ string
if (strcmp(echoBuffer, "dudeldei") == 0) {}
if (strcmp(echoBuffer, "Q") == 0) {}
if (strcmp(echoBuffer, "Quack") == 0) {}
SprinterSB
05.07.2006, 10:30
Ein fast HW-unabhängiges Beispiel, das soas macht findest du in Sprungtabelle (https://www.roboternetz.de/wissen/index.php/Avr-gcc#Sprungtabelle)
Im Endeffekt ist's das was PicNick schon geschrieben hat, nur mit einer Schleife drumrum.
öhm .. schon mal mit
strchr
strstr
strtok
auseinandergesetzt ?
Alle (inkl. strcmp - würbe besser strncmp nehmen) sind case-sensitiv .. also ggf ein strupr machen ....
öhm .. schon mal mit...auseinandergesetzt ?
Haben wir. Für ernsthaftes Parsen is das aber nix.
Stoneman
05.07.2006, 12:12
So ich habe das jetzt hinbekommen, und zwar habe ich zuerst \r und \n durch ein 0x20 ersetzt und dann den Code von PicNick verwendet, vielen Dank für eure Hilfe
Mfg
Stoneman
... Für ernsthaftes Parsen is das aber nix.
Das sehe ich anders. Nicht schlechter als ein strcmp !
strcmp() is ok. Für normalisierte Daten ist er gut, berücksichtigt die Länge, und reicht in vielen (meisten) Fällen.
Die anderen überlaß' ich Dir zur freien Verwendung, ich werd' Dir da nix dreinreden.
na prima - mich würde Deine Begründung für Deine Aussage "ernsthaftes Parsen is das aber nix" interessieren !!!!!
Ist im Grunde leicht gesagt, wenn auch etwas allgemein: wenn der Input komplexer wird und syntaktischen Regeln unterliegt.
Beispiel, fällt mir grad ein: Mail holen vom Server
achso ... so meinst Du das, ich dachte schon, Du hast die strxxx-Befehle analysiert und was schreckliches festgestellt ...
... natürlich ist die Verwendung der einzelnen Befehlchen abhängig davon, was man(oder frau) damit erreichen will ... wollte nur dran erinnern, daß es außer strcmp eben noch andere möglichkeiten gibt, die natürlich besonders beim Parsen von bekannten Inhalten helfen. .... Danke.
..abhängig davon, was man(oder frau) damit erreichen will ..
Mit der Aussage können wir wohl alle gut leben :-)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.