首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析4个单字节的ip地址字符串

解析4个单字节的ip地址字符串
EN

Stack Overflow用户
提问于 2012-02-09 21:19:55
回答 4查看 22.4K关注 0票数 2

我用C语言在MCU上编程,我需要将一个以null结尾的字符串解析成4个单字节,其中包含一个IP地址。我用C++做了一个例子:

代码语言:javascript
复制
#include <iostream>
int main()
{
    char *str = "192.168.0.1\0";
    while (*str != '\0')
    {
            if (*str == '.')
            {
                    *str++;
                    std::cout << std::endl;
            }
            std::cout << *str;
            *str++;
    }
    std::cout << std::endl;
    return 0;
}

这段代码在新行中打印192、168、0和1个字节。现在我需要在单个字符中包含每个字节,如char byte1、byte2、byte3和byte4,其中byte1包含1,byte4包含192...或者在结构IP_ADDR中,然后返回该结构,但我不知道如何用C :(

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-09 22:22:33

您可以逐个字符地执行此操作,正如您问题中的C++版本一样。

代码语言:javascript
复制
/* ERROR CHECKING MISSING */
#include <ctype.h>
#include <stdio.h>
int main(void) {
    char *str = "192.168.0.1", *str2;
    unsigned char value[4] = {0};
    size_t index = 0;

    str2 = str; /* save the pointer */
    while (*str) {
        if (isdigit((unsigned char)*str)) {
            value[index] *= 10;
            value[index] += *str - '0';
        } else {
            index++;
        }
        str++;
    }
    printf("values in \"%s\": %d %d %d %d\n", str2,
              value[0], value[1], value[2], value[3]);
    return 0;
}
票数 4
EN

Stack Overflow用户

发布于 2012-02-09 21:24:12

代码语言:javascript
复制
for(int i = 0, r = 0; i < 4; str += r + 1, i++) {
  sscanf(str, "%d%n", &b[i], &r);
}

代码语言:javascript
复制
 sscanf(str, "%d.%d.%d.%d", b, b + 1, b + 2, b + 3);
票数 2
EN

Stack Overflow用户

发布于 2014-12-30 18:35:30

我想提供更严格的版本来解析ipv4地址

代码语言:javascript
复制
typedef struct ipv4_type {
    uint8_t data[4];
} ipv4;

ipv4_error ipv4_parse ( const uint8_t * string, uint8_t string_length, ipv4 * result )
{
    bool at_least_one_symbol = false;
    uint8_t symbol, string_index = 0, result_index = 0;
    uint16_t data = 0;
    while ( string_index < string_length ) {
        symbol = string[string_index];
        if ( isdigit ( symbol ) != 0 ) {
            symbol -= '0';
            data   = data * 10 + symbol;
            if ( data > UINT8_MAX ) {
                // 127.0.0.256
                return ERROR_IPV4_DATA_OVERFLOW;
            }
            at_least_one_symbol = true;
        } else if ( symbol == '.' ) {
            if ( result_index < 3 ) {
                if ( at_least_one_symbol ) {
                    result->data[result_index] = data;
                    data = 0;
                    result_index ++;
                    at_least_one_symbol = false;
                } else {
                    // 127.0..1
                    return ERROR_IPV4_NO_SYMBOL;
                }
            } else {
                // 127.0.0.1.2
                return ERROR_IPV4_INPUT_OVERFLOW;
            }
        } else {
            // 127.*
            return ERROR_IPV4_INVALID_SYMBOL;
        }
        string_index ++;
    }
    if ( result_index == 3 ) {
        if ( at_least_one_symbol ) {
            result->data[result_index] = data;
            return 0;
        } else {
            // 127.0.0.
            return ERROR_IPV4_NOT_ENOUGH_INPUT;
        }
    } else {
        // result_index will be always less than 3
        // 127.0
        return ERROR_IPV4_NOT_ENOUGH_INPUT;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9211601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档