[問題] 搜尋網頁裡的關鍵字 在統計關鍵字的次數

看板C_and_CPP (C/C++)作者 (rock666)時間16年前 (2010/02/20 21:51), 編輯推噓1(109)
留言10則, 4人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 這個程式大致上是從 "http://www-cs-faculty.stanford.edu/~knuth/taocp.html" 網頁裡 搜尋"volume"然後顯示出來 不過他跳出來的是有幾個"volume"一一把他列出來 有六個的話ex: volume volume volume volume volume volume 以下是程式碼 ------------------------------------------------------------------ #pragma comment(lib, "WS2_32") #include <WinSock2.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define PORT 6666 #define FENGYUN_IP "207.182.234.180" #define GOOGLE_IP "72.14.207.99" #define CSDN_IP "211.100.26.124" #define NYIST_IP "202.102.240.77" #define MAX_PACKET_SIZE (1024*20) bool parser (char *url, char *host, char *dir) { int i; for (i = 0; url == "http://" && i < sizeof ("http://"); i++); if (i >= sizeof ("http://")) { printf ("no http://\n"); return false; } for (; url && url != '/'; i++) *host++ = url; *host = '\0'; for (; url; i++) *dir++ = url; *dir = '\0'; return true; } void findhref (char *buf) { char href[4] = {'h', 'r', 'e', 'f'}; char hrefbig[4] = {'H', 'R', 'E', 'F'}; char url[128]; while (*buf) { for (int i = 0; i <= 7 && buf; ++i); if (i <= 7) break; if (*(int *)buf == *(int *)href || *(int *)buf == *(int *)hrefbig) { int i = 0; for (buf += 6; buf[0] && buf[0] != '\'' && buf[0] != '"' && buf[0] != '>'; buf++, i++) url = buf[0]; url = '\0'; printf ("%s\n", url); } buf++; } } void findword (char *buf, char *word) { while (*buf) { if (buf[0] == '<') while (buf[0] != '>' && buf[0]) buf++; char *p = word; while (*buf == *p && buf[0] && p[0]) buf++, p++; if (*p == '\0') printf ("%s\n", word); buf++; } } int main () { SOCKET g_sClient; char g_szBuff[MAX_PACKET_SIZE + 2]; WSADATA wsaData; WORD socketVersion = MAKEWORD(2, 2); if (WSAStartup(socketVersion, &wsaData) != 0) { printf("Init socket dll error\n"); } if (SOCKET_ERROR == (g_sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))) { printf("Init Socket Error!\n"); } HOSTENT *hptr; char *url = "http://www-cs-faculty.stanford.edu/~knuth/taocp.html"; char host[64], dir[128]; parser (url, host, dir); if ((hptr = gethostbyname(host)) == NULL) { printf("gethostbyname error for host:%s\n", dir); } printf ("ip:%s\n", inet_ntoa( *(IN_ADDR*)hptr->h_addr_list[0])); sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(80); servAddr.sin_addr.S_un.S_addr = inet_addr(inet_ntoa( *(IN_ADDR*)hptr->h_addr_list[0])); if (INVALID_SOCKET == (connect(g_sClient, (sockaddr*)&servAddr, sizeof(sockaddr_in)))) { printf("Connect to Server Error!\n"); } char buf[256] = "0"; sprintf (buf, "GET %s \nHOST:%s \n\n", dir, host); if (SOCKET_ERROR == send(g_sClient, buf, sizeof(buf)+1, 0)) { printf("Send File Name Error!\n"); } int nRecv; do { nRecv = recv(g_sClient, g_szBuff, MAX_PACKET_SIZE+1, 0); g_szBuff[nRecv] = '\0'; findword (g_szBuff, "volume"); } while (nRecv > 0); closesocket(g_sClient); WSACleanup(); system ("pause"); return 0; } 希望得到的正確結果: 不過我想把它改成跑出來六個的話 他會顯示 volume*6 之類的 不過很多地方都還看不懂 有大大可以幫幫忙嗎 如果可以的話 順便解釋一下一些地方有什麼用途 拜託啦 程式跑出來的錯誤結果: 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) Dev-C++ 有問題的code: (請善用置底文標色功能) 補充說明: -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.46.192.80

02/20 22:38, , 1F
網路的地方不用動 直接加一個函式來做你的事情
02/20 22:38, 1F

02/20 22:39, , 2F
在findword 另外統計就可以了
02/20 22:39, 2F

02/20 23:04, , 3F
請問大大 findword 裡要怎麼改@@
02/20 23:04, 3F

02/21 01:42, , 4F
加入全域或靜態變數(static int cnt);
02/21 01:42, 4F

02/21 01:43, , 5F
把 printf 那行換成 cnt++; 程式結束時 print cnt
02/21 01:43, 5F

02/21 01:57, , 6F
話說 char url[128] ?? 是不是容易爆丫??
02/21 01:57, 6F

02/21 01:57, , 7F
不是蠻多 link 都是一狗串的嗎 ?
02/21 01:57, 7F

02/21 02:05, , 8F
謝謝大大回覆 cut要放在哪邊宣告
02/21 02:05, 8F

02/21 02:51, , 9F
不懂網路 但你parser內 寫url=="http://" 怎麼可以這樣比對?
02/21 02:51, 9F

02/21 02:51, , 10F
你是char*不是string耶
02/21 02:51, 10F
文章代碼(AID): #1BV-Zt2u (C_and_CPP)
文章代碼(AID): #1BV-Zt2u (C_and_CPP)