"\n und \r" aus char filtern?
-
Hallo,
Alle möglichen währe natürlich am besten!
-
was genau verstehst du unter dem filtern... soll der string nachher entsprechend gekürzt sein oder sollen an der stelle der escapesequenzen andere zeichen stehen...
am einfachsten ist vermutlich einfach in ner schleife durchzulaufen..
vorher definierst du noch was ein valides oder invalides zeichen ist (je nachdem was einfacher ist, wenn du z.b. nur zahlen und buchstaben erlauben willst wäre es einfacher isalpha und isdigit zu verwenden als alles andere als invalide zu definieren)...und dann jagst du die schleife drüber...
wenn du verschieben willst, also den string verkleinern ists wohl einfacher einen zweiten buffer zu nehmen und nur die zeichen rüberzukopieren die du haben willst an sonsten einfach die zeichen in der schleife überschreiben die du nicht mehr haben willst.
-
naja denke so könnts klappen
#include <iostream> using namespace std; //--------------------------------------------------------------------------- int main() { bool erased =false; char escapes[]={'a','b','f','n','r','t','v'};//mehr fallen mir grad nicht ein int anz_es=sizeof(escapes)/(sizeof(char)); char input[32]="nur\\a\\n\\fkleiner\\ttest\\n\\g"; string tmp=input; cout<<"before :"<<tmp<<endl; for(unsigned int a=0;a<tmp.length();a++) if(tmp[a]=='\\'){ for(int i=0;i<anz_es;i++) if(tmp[a+1]==escapes[i]){ tmp.erase(a,2); erased=true; } if(erased==true){ a-=2;//sonst würden wir 2 stellen überspringen durch erase erased=false; } } cout<<"after :"<<tmp<<endl; getchar(); return 0; }
müsste zumindest
-
Hallo,
Danke!
Aber:
string remEscapes(char input[1024]) { bool erased = false; char escapes[] = {'a','b','f','n','r','t','v'}; int anz_es = sizeof(escapes) / (sizeof(char)); string tmp = input; for(unsigned int a=0; a < tmp.length(); a++) if(tmp[a] == '\\') { for(int i=0; i < anz_es; i++) if(tmp[a+1] == escapes[i]) { tmp.erase(a,2); erased = true; } if(erased == true) { a -= 2; erased = false; } } return tmp; }
Gibt zwar keine Fehler, aber es wird nix entfernt
-
mhh doch
cout<<remEscapes("test\\f_gelingt");
naja ich bekomme den string ohne /f zurück ..
kann es sein dassu es irgendwie anders meinst???
-
#include <iostream> #include <windows.h> #include "winsock2.h" #include <string.h> using namespace std; string remEscapes(char input[1024]) { bool erased = false; char escapes[] = {'a','b','f','n','r','t','v'}; int anz_es = sizeof(escapes) / (sizeof(char)); string tmp = input; for(unsigned int a=0; a < tmp.length(); a++) if(tmp[a] == '\\') { for(int i=0; i < anz_es; i++) if(tmp[a+1] == escapes[i]) { tmp.erase(a,2); erased = true; } if(erased == true) { a -= 2; erased = false; } } return tmp; } int main() { // Winsock starten WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != NO_ERROR) cout << "Konnte Winsock nicht initialisieren" << endl; // Socket erstellen SOCKET ConnectSocket; ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (ConnectSocket == INVALID_SOCKET) { cout << "Konnte Socket nicht erstellen!" << endl; WSACleanup(); return 0; } // IP krimskrams sockaddr_in clientService; clientService.sin_family = AF_INET; clientService.sin_addr.s_addr = inet_addr("213.203.xxx.xxx"); clientService.sin_port = htons(25); // Verbinden if (connect(ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) { cout << "Konnte Verbindung nicht herstellen" << endl; WSACleanup(); return 0; } cout << "Verbind zum Server steht!" << endl; //WSACleanup(); char sendData[1024] = "HELO bla\r\n"; send(ConnectSocket, sendData, strlen(sendData), 0); cout << "Folgendes wurde gesendet: \"" << remEscapes(sendData) << "\"."; Sleep(500); char sendData0[1024] = "MAIL FROM:<board@nuxxx.de>\r\n"; send(ConnectSocket, sendData0, strlen(sendData0), 0); cout << "Folgendes wurde gesendet: \"" << remEscapes(sendData0) << "\"."; Sleep(500); char sendData1[1024] = "RCPT TO:<webmaster@nuxxx.de>\r\n"; send(ConnectSocket, sendData1, strlen(sendData1), 0); cout << "Folgendes wurde gesendet: \"" << remEscapes(sendData1) << "\"."; Sleep(500); char sendData2[1024] = "DATA\r\n"; send(ConnectSocket, sendData2, strlen(sendData2), 0); cout << "Folgendes wurde gesendet: \"" << remEscapes(sendData2) << "\"."; Sleep(500); char sendData3[1024] = "Blah blah blah...\r\n"; send(ConnectSocket, sendData3, strlen(sendData3), 0); cout << "Folgendes wurde gesendet: \"" << remEscapes(sendData3) << "\"."; Sleep(500); char sendData4[1024] = ".\r\n"; send(ConnectSocket, sendData4, strlen(sendData4), 0); cout << "Folgendes wurde gesendet: \"" << remEscapes(sendData4) << "\"."; return 0; }
Sorry, der Code ist geschludert ^^ Aber das ist nur eine übung zu sockets
Funzt leider nicht
-
sorry isr klar ich habe ja auch nicht sie escape sequenz rausgemacht sondern den ausdruck "\" der ja gerade keine ist .. sorry aber kann man eigentlich die escape sequenzen überhaupt rausschneiden ??? weiss grad wenn nicht wie dachte immer die werden bei der compilierung anders behandelt
manno meine fachsprache entspticht der eines dummies .. naja passt schon
-
Try this (untested)
string removeEscape(const string& s) { char escapes [] = { '\a', '\r' /* ... */ }; string r; bool fl = false; for (int i = 0; i < s.length(); i++) { for(int n = 0; n < sizeof(escapes); n++) { fl = (s[i] == escapes[n]); if (fl) break; } if (!fl) r += s[i]; } return r; }
"Escape Sequenzen" sind nix andres als Buchstaben. '\r' hat halt den 10 während 'A' 65 hat
mfg
-
echt wusste ich nicht @ ascii zeichen der sequenzen ...
hamm wa was gelernt
-
Ich hab noch einmal eine etwas übersichtlichere und schnellere Lösung mit remove_if zusammengebastelt:
bool escape (char &val) { static const char escapeCodes[] = {'\a','\b','\f','\n','\r','\t','\v'}; for (unsigned int i = 0; i < sizeof (escapeCodes) / sizeof (escapeCodes[0]); ++i) if (escapeCodes[i] == val) return true; return false; } std::string removeEscape (std::string str) { std::string::iterator new_end = std::remove_if (str.begin (), str.end (), escape); str.erase (new_end, str.end ()); return str; }
-
Hallo,
@cvw, klappt prima
Danke!