ip_parse_rs/
lib.rs

1/*
2请使用Rust语言实现IPv4地址转换为整数,例如
3"172.168.5.1" => 2896692481
4要求
51.只能遍历一次字符串
62.若 . 附近存在空格,为有效输入;若数字中存在空格,则报错.
7    例如:
8        “172.168.5.1” 为有效输入,正常应答
9        "1 72.168.5.1"为无效输入,返回错误
103.提供完善的单元测试
11*/
12pub fn ipv4_to_int(ip: &str) -> Result<u32, &'static str> {
13    let mut result = 0;
14    let mut num = 0;
15    let mut count = 0;
16    for c in ip.chars() {
17        if c == '.' {
18            if count == 0 {
19                return Err("Invalid input");
20            }
21            result = result << 8 | num;
22            num = 0;
23            count = 0;
24        } else if c == ' ' {
25            return Err("Invalid input");
26        } else if c.is_digit(10) {
27            num = num * 10 + c.to_digit(10).unwrap();
28            count += 1;
29        } else {
30            return Err("Invalid input");
31        }
32    }
33    if count == 0 {
34        return Err("Invalid input");
35    }
36    result = result << 8 | num;
37    Ok(result)
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn test_ipv4_to_int() {
46        assert_eq!(ipv4_to_int("172.168.5.1"), Ok(2896692481));
47        assert_eq!(ipv4_to_int("1 72.168.5.1"), Err("Invalid input"));
48        assert_eq!(ipv4_to_int("172.168.5.1 "), Err("Invalid input"));
49    }
50}