我正在爲我的一個CS類學習C++,並且對於我們的第一個項目,我需要使用c-string解析一些URL(即,我不能使用C++ String類) 。在C++中使用C-Strings解析URL
我能想到的唯一方法就是迭代(因爲它是一個char [])並使用一些switch語句。從C++經驗豐富的人開始 - 有更好的方法嗎?你能否指點我一個很好的在線資源?我還沒有找到。
我正在爲我的一個CS類學習C++,並且對於我們的第一個項目,我需要使用c-string解析一些URL(即,我不能使用C++ String類) 。在C++中使用C-Strings解析URL
我能想到的唯一方法就是迭代(因爲它是一個char [])並使用一些switch語句。從C++經驗豐富的人開始 - 有更好的方法嗎?你能否指點我一個很好的在線資源?我還沒有找到。
奇怪你不允許使用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;
至於實際上如何解析,你必須自己解決。畢竟這是一項任務。
可以使用C函數像strtok的,和strchr,等的strstr
有許多C標準庫函數可以幫助您。
首先看看C標準庫函數strtok。這使您可以檢索由某些分隔符分隔的C字符串的部分內容。例如,您可以使用分隔符/進行標記,以獲取協議,域和文件路徑。您可以使用分隔符來標記域。獲取子域名,二級域名和頂級域名。等等
它不像正則表達式解析器那麼強大,這是您真正想要解析URL的方法,但它適用於C字符串,是C標準庫的一部分,可能在您的分配。
其他C標準庫函數,可以幫助:
編輯:一個提醒,正確的方法在C++中使用這些函數是包括<cstring>
和使用它們std ::名稱空間,例如的std :: strtok的()。
strtok是非常討厭的,因爲它修改了字符串。我是const的忠實粉絲,所以我建議避免使用strtok。 – 2009-09-03 04:19:42
IMO,strtok是非常有用的,並且比僅使用C標準庫解析字符串時手動編碼的所有內容都要少得多。但是,是的,你必須小心它的問題,包括字符串修改和非重入(儘管POSIX提供了一個名爲strtok_r的重入版本) – 2009-09-03 14:05:56
我不知道解析URL的要求是什麼, 但是如果這是CS級別,那麼使用BNF和(非常簡單的)遞歸下降解析器是適當的。
這將產生比直接迭代例如直接迭代更穩健的解決方案,針對格式不正確的網址。
需要標準C庫中很少的字符串函數 。
已經提到的許多運行時庫函數工作得很好,要麼與迭代遍歷所提到的字符串的方法(我認爲這是很榮幸的)相結合或分開。
'strdup'不在標準庫中,它由POSIX定義。 – 2009-09-03 00:46:00
如果他沒有strdup(),那麼提供它的任務將是一個很好的部分。白手起家! – 2009-09-03 00:50:58