[英]What's the easiest way to parse a string in C?
我必須在C中解析這個字符串:
XFR 3 NS 207.46.106.118:1863 0 207.46.104.20:1863\r\n
並且能夠獲得207.46.106.118
部分和1863
部分(第一個IP地址)。
我知道我可以通過char查找char並最終通過它查找,但是獲取此信息的最簡單方法是什么,因為字符串中的IP地址可能會更改為不同的格式(數字更少)?
您可以使用C標准庫中的sscanf()
。 這是一個如何將ip和port作為字符串的示例,假設地址前面的部分是常量:
#include <stdio.h>
int main(void)
{
const char *input = "XFR 3 NS 207.46.106.118:1863 0 207.46.104.20:1863\r\n";
const char *format = "XFR 3 NS %15[0-9.]:%5[0-9]";
char ip[16] = { 0 }; // ip4 addresses have max len 15
char port[6] = { 0 }; // port numbers are 16bit, ie 5 digits max
if(sscanf(input, format, ip, port) != 2)
puts("parsing failed");
else printf("ip = %s\nport = %s\n", ip, port);
return 0;
}
格式字符串的重要部分是掃描集模式%15[0-9.]
和%5[0-9]
,它們將匹配由數字或點組成的最多15個字符的字符串(即IP地址不會檢查格式良好)和最多5位數的字符串(這意味着2 ^ 16 - 1之上的無效端口號將會漏掉)。
取決於定義文檔格式的內容。 在這種情況下,它可以像標記字符串一樣簡單,並通過標記查找您想要的內容。 只需使用strtok
並拆分空格即可獲取207.46.106.118:1863
,然后您可以再次對其進行標記(或者只是掃描:
手動)以獲取正確的組件。
您可以使用strtok
來標記空間中斷,或者您也可以使用scanf
系列中的一個來提取數據。
但是,所有這些都有一個很大的警告,這些功能因安全性和錯誤處理錯誤輸入而臭名昭着。 因人而異。
循環直到你得到第一個'。',並循環回到你發現''。 循環前進,直到找到':',每次遇到'。'時都會構建子字符串。 要么 ':'。 您可以通過簡單的錯誤檢查來檢查子串的數量及其長度。 然后循環直到找到''並且你有1863部分。
如果字符串的開頭變化不大,這將是健壯的。 而且也很容易。 如果字符串始終以“XFR 3 NS”開頭,則可以使其更簡單。
在這種情況下,strok()是微不足道的,將是我的選擇。 為安全起見,您可以在字符串中計算“:”,如果只有一個':'則繼續。
如果要解析的字符串格式良好,那么我將使用Daniel和Ukko的建議來使用strtok()。
但是有一個警告:strtok()修改它解析的字符串。 並不總是你想要的。
這可能有點過頭了,因為你說你不想使用正則表達式庫,但是re2c程序會在沒有庫的情況下為你提供正則表達式解析:它為正則表達式生成DFSM作為C代碼。 正則表達式在嵌入在C代碼中的注釋中指定。
如果你必須解析其余的字符串,現在看起來像矯枉過正的事可能會讓你感到安慰。 修改一些正則表達式以調整或添加新語法比修改一堆ad hoc標記化代碼要容易得多。 它使您在代碼中解析的結構更加清晰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.