我用C语言在MCU上编程,我需要将一个以null结尾的字符串解析成4个单字节,其中包含一个IP地址。我用C++做了一个例子:
#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 :(
发布于 2012-02-09 22:22:33
您可以逐个字符地执行此操作,正如您问题中的C++版本一样。
/* 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;
}发布于 2012-02-09 21:24:12
for(int i = 0, r = 0; i < 4; str += r + 1, i++) {
sscanf(str, "%d%n", &b[i], &r);
}或
sscanf(str, "%d.%d.%d.%d", b, b + 1, b + 2, b + 3);发布于 2014-12-30 18:35:30
我想提供更严格的版本来解析ipv4地址
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;
}
}https://stackoverflow.com/questions/9211601
复制相似问题