【问题标题】:Converting IP address char to long将 IP 地址 char 转换为 long
【发布时间】:2017-01-31 07:43:54
【问题描述】:

我编写了一个小程序将 char 转换为 long,但是当我尝试打印 char 形式时,它的输出被破坏了。

int main()
{
    long l;
    char *buf = "127.0.0.1";
    memcpy(&l, buf, sizeof(long));
    printf("%s\n", (char *)&l);

    return 0;
}

输出如下:

127.0.0.t�턾U

我知道我遗漏了一些简单的东西,但我正在画一个空白。

【问题讨论】:

  • 这里有很多未定义的行为。您基本上只是将前 8 个字符复制到一个长槽中并打印一个非空终止字符指针。真的没有转换成长期发生的事情,幸运的是,打印输出没有继续进行。我建议您阅读 C 入门书——也许是 K&R 书。
  • 一切都错了,你最好回到你的 C 书,当你对所有这些是如何工作的了解更多时再回来。
  • 你缺少的是这不应该工作。
  • 我没有看到任何代码来转换任何东西。我看到代码尝试将字符串复制到应该保存很长的东西中,然后尝试从保存很长的东西中打印字符串。真正转换任何东西的代码在哪里?

标签: c long-integer


【解决方案1】:

似乎有一些基本的误解:-)

char *long 数据类型之间复制不会将由数字序列表示的“数字”转换为类似于long 的“二进制”数字;从longchar * 的演员也不会在你的printf-statement 中做相反的事情。

char* 转换为long 是使用atol 完成的,而将long 打印到控制台是通过printf("%ld",l) 完成的

祝您在获得经验丰富的 C 程序员的道路上好运和耐心,不要犹豫:-)

【讨论】:

    【解决方案2】:

    这是一个程序,它以输入字符串的形式获取 IP 地址,并将其转换为 long 值。 filter_ip() 函数用于首先从字符串中删除所有非数字字符。然后使用strtol() 将字符串转换为long 值。

    使用strtol() 比使用atol() 更好,因为strtol() 检测整数溢出。 errnoerror.h头文件中声明,strtol()设置errno的值如果有溢出。 strtol() 从字符串的开头开始转换尽可能多的字符,并将tailptr 设置为指向剩余的字符。如果无法进行转换,tailptr 将指向字符串的开头。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <errno.h>
    
    void filter_ip(char *str);
    
    int main(void)
    {
        char ip_addr[] = "127.0.0.1";
        long res;
        char *tailptr;
    
        printf("IP Address: %s\n", ip_addr);
        filter_ip(ip_addr);
    
        errno = 0;
        res = strtol(ip_addr, &tailptr, 10);
        if (errno) {
            perror("Unable to convert IP address");
        } else if (tailptr == ip_addr) {
            fprintf(stderr, "No conversion performed\n");
        } else {
            printf("%ld\n", res);
        }
    
        return 0;
    }
    
    void filter_ip(char *str)
    {
        size_t i, j;
    
        for (i = 0, j = 0; str[i] != '\0'; i++) {
            if (isdigit(str[i])) {
                str[j++] = str[i];
            }
        }
        str[j] = '\0';
    }
    

    程序输出:

    IP Address: 127.0.0.1
    127001
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2011-07-23
      • 2013-05-09
      • 2020-05-06
      • 2011-02-25
      • 1970-01-01
      相关资源
      最近更新 更多