簡體   English   中英

在C中解析字符串最簡單的方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM