Ausgabe
Ich habe einen Text, der eine Liste von ip:port enthält, und ich habe ein Multithreading-Programm, das sie separat in IP und Port aufteilt. Ich habe strtok verwendet, aber es gibt viele Fehler und Probleme und das Programm bekommt jedes Mal einen Segmentierungsfehler + es muss make to strdup char pointer machen, was sehr ärgerlich ist. Ich habe strchr verwendet, aber es gibt mir nur den Port, kann ihn aber nicht zum Extrahieren der IP verwenden. Das Ziel ist, IP als Zeichenfolge und den Port als Ganzzahl zu extrahieren, und die Segmentierung wird nie fehlgeschlagen
Beispiel:
Dies ist die Startfunktion des Threads
void* startthread() {
do {
char* proxy = "127.0.0.1:443";
char* buffered = strdup(proxy);
char* host = strtok(buffered,":");
int port = atoi(strtok(NULL,":"));
printf("%s:%d",host,port);
}while(1);
}
gdb
Thread 8 "main" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff4a34700 (LWP 47410)]
__GI_____strtol_l_internal (nptr=0x0, endptr=endptr@entry=0x0,
Lösung
Eine ziemlich einfache Möglichkeit, dies zu handhaben (die gemäß Ihren Tags sowohl mit C als auch mit C++ kompatibel ist), wäre die Verwendung von sscanf
:
char host[256];
int port;
sscanf(proxy, "%255[^:]:%d", host, &port);
Aber ja, strtok
und Multithreading ist eine miese Kombination. Dann wieder, strtok
und fast alles ist eine miese Kombination.
Ich nehme an, um vollständig zu sein, muss ich darauf hinweisen, dass das [^:]
Scanformat vom implementierungsdefinierten Verhalten abhängt. Theoretisch darf eine Implementierung dies wörtlich behandeln – als Bedeutung entweder ^
oder :
, anstatt “alles außer einem Doppelpunkt” – aber ich kenne nur eine Implementierung (Borlands Compiler für MS-DOS), die dies getan hat, und es ist längst überholt.
Beantwortet von – Jerry Coffin
Antwort geprüft von – Gilberto Lyons (FixError Admin)