我需要<a href="xxxxxx">在不使用外部庫的情況下以 HTML 回應的形式找出所有超鏈接。因此,我strtok(message, " \n<>")習慣將回應分成幾部分。如果最后一塊是a并且當前一塊以 開頭href,我們會找到一個鏈接。但是,代碼性能不佳,產生記憶體問題。
VS 代碼不斷彈出帶有文本的訊息,如下所示:
無法打開“strlen.S”:無法讀取檔案“/build/glibc-S7Ft5T/glibc-2.23/sysdeps/x86_64/strlen.S”(錯誤:無法決議不存在的檔案“/build/glibc-S7Ft5T/glibc” -2.23/sysdeps/x86_64/strlen.S')。
在終端中,它列印出:
[1] 完成 "/usr/bin/gdb" --interpreter=mi --tty=${DbgTerm} 0<"/tmp/Microsoft-MIEngine-In-fjtfcdmp.4qw" 1>"/tmp/Microsoft- MIEngine-Out-hlygokwk.gwa"
這是我的代碼:
// Omit the sending and receiving part
//
if(recv(tcpSocket, response_buf, sizeof(response_buf), 0) < 0){
printf("Error with recv()\n");
}
else {
printf("Successfully receive response\n");
// printf("Message received:\n %s\n", response_buf);
}
printf("===============================\n");
char * const dupstr = strdup(response_buf);
char* token = NULL;
token = strtok(dupstr, " \n<>");
char last_token[2000];
char token_head[1000];
char a[] = "a";
char href[] = "href=";
while (token != 0) {
strcpy(last_token, token);
token = strtok(NULL, " \n<>");
if(strcmp(last_token, a) == 0){
size_t len = strlen(token);
if(len>5){
strncpy(token_head, token, 5);
if(strcmp(token_head, href)== 0){
printf("%s\n", token);
}
}
}
}
uj5u.com熱心網友回復:
您在除錯時嘗試單步執行,并嘗試單步執行庫函式。
在您發布的案例中,您嘗試進入strlen(). 通常,此類功能的源檔案不包含在安裝中。這就是為什么您的除錯器告訴您它找不到源檔案的原因。
如果您使用單步除錯程式,請使用“next”來跳過庫函式的函式呼叫。
uj5u.com熱心網友回復:
我可以看到的主要問題是您的代碼沒有正確檢查strtok. 您只token在回圈開始時檢查 的值,然后呼叫strtok. 如果它回傳NULL,則直到回圈的其余部分發生后您才會發現。
你想像這樣移動strtok到回圈的末尾
while (token != 0) {
if(strcmp(last_token, a) == 0){
size_t len = strlen(token);
if(len>5){
strncpy(token_head, token, 5);
if(strcmp(token_head, href)== 0){
printf("%s\n", token);
}
}
}
strcpy(last_token, token);
token = strtok(NULL, " \n<>");
}
...以便支票實際上完成了它的意圖。
或者執行回圈的另一種方法是使用for回圈
for(token = strtok(dupstr, " \n<>"); token != NULL; token = strtok(NULL, " \n<>")) {
if(strcmp(last_token, a) == 0){
size_t len = strlen(token);
if(len>5){
strncpy(token_head, token, 5);
if(strcmp(token_head, href)== 0){
printf("%s\n", token);
}
}
strcpy(last_token, token);
}
無論哪種方式,您都需要正確初始化last_token,直到strcpy對它的呼叫可以包含任何內容。
你也永遠不會免費dupstr。雖然目前這不是問題,因為它會在代碼退出時處理,但free在分配記憶體時添加相應的呼叫始終是一個好習慣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/373184.html
上一篇:多行到PHP關聯陣列
