2009-09-03 148 views
2

我正在爲我的一個CS類學習C++,並且對於我們的第一個項目,我需要使用c-string解析一些URL(即,我不能使用C++ String類) 。在C++中使用C-Strings解析URL

我能想到的唯一方法就是迭代(因爲它是一個char [])並使用一些switch語句。從C++經驗豐富的人開始 - 有更好的方法嗎?你能否指點我一個很好的在線資源?我還沒有找到。

回答

6

奇怪你不允許使用C++語言特性,例如C++字符串!

標準C庫中有一些C字符串函數可用。

例如

strdup - duplicate a string 
strtok - breaking a string into tokens. Beware - this modifies the original string. 
strcpy - copying string 
strstr - find string in string 
strncpy - copy up to n bytes of string 
etc 

有一個良好的網上參考這裏可用的C字符串函數 用於搜索和尋找事物的完整列表。

http://www.cplusplus.com/reference/clibrary/cstring/

您可以通過串通過訪問他們像一個數組,如果你需要步行。

例如

char* url="http://stackoverflow.com/questions/1370870/c-strings-in-c" 
int len = strlen(url); 
for (int i = 0; i < len; ++i){ 
    std::cout << url[i]; 
} 
std::cout << endl; 

至於實際上如何解析,你必須自己解決。畢竟這是一項任務。

+3

'strdup'不在標準庫中,它由POSIX定義。 – 2009-09-03 00:46:00

+0

如果他沒有strdup(),那麼提供它的任務將是一個很好的部分。白手起家! – 2009-09-03 00:50:58

0

可以使用C函數像strtok的,和strchr,等的strstr

2

您可能要參考的一個開源庫,可以解析的網址(如爲其他人如何做它的參考 - 顯然別t複製並粘貼它!),如curlwget(鏈接直接到它們的url解析文件)。

+1

由於某種原因,我懷疑他的教練正在尋找什麼。 – 2009-09-03 00:39:39

+0

@邁克爾:我想和你一樣,直到我意識到他可能意味着提問者使用思想來源。 – Sean 2009-09-03 00:40:55

+1

不夠公平......現在我想知道是否有人不知道C庫基礎知識能夠讓自己的頭腦避免通過代碼閱讀? – 2009-09-03 00:51:30

5

有許多C標準庫函數可以幫助您。

首先看看C標準庫函數strtok。這使您可以檢索由某些分隔符分隔的C字符串的部分內容。例如,您可以使用分隔符/進行標記,以獲取協議,域和文件路徑。您可以使用分隔符來標記域。獲取子域名,二級域名和頂級域名。等等

它不像正則表達式解析器那麼強大,這是您真正想要解析URL的方法,但它適用於C字符串,是C標準庫的一部分,可能在您的分配。

其他C標準庫函數,可以幫助:

  • 的strstr()提取子一樣的std :: string :: SUBSTR()
  • strspn(),和strchr()和strpbrk()查找在一個字符串的字符或字符,類似的std :: string :: find_first_of()等

編輯:一個提醒,正確的方法在C++中使用這些函數是包括<cstring>和使用它們std ::名稱空間,例如的std :: strtok的()。

+0

strtok是非常討厭的,因爲它修改了字符串。我是const的忠實粉絲,所以我建議避免使用strtok。 – 2009-09-03 04:19:42

+0

IMO,strtok是非常有用的,並且比僅使用C標準庫解析字符串時手動編碼的所有內容都要少得多。但是,是的,你必須小心它的問題,包括字符串修改和非重入(儘管POSIX提供了一個名爲strtok_r的重入版本) – 2009-09-03 14:05:56

1

我不知道解析URL的要求是什麼, 但是如果這是CS級別,那麼使用BNF和(非常簡單的)遞歸下降解析器是適當的。

這將產生比直接迭代例如直接迭代更穩健的解決方案,針對格式不正確的網址。

需要標準C庫中很少的字符串函數 。

0

已經提到的許多運行時庫函數工作得很好,要麼與迭代遍歷所提到的字符串的方法(我認爲這是很榮幸的)相結合或分開。