2017-01-30 142 views
-1

我编写了一个小程序来将char转换为long,但是当我尝试打印char形式时,它已经输出了错误。将IP地址char转换为long

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턾ü

我知道我失去了一些东西简单,但我画一个空白。

+0

有很多的不确定的行为在这里。你基本上只是将前8个字符复制到一个长插槽并打印一个非空终止的字符指针。真的没有转变成长时间的事情,幸运的是打印输出不会继续。我建议你阅读C的入门书 - 也许是K&R书。 – synchronizer

+1

在这里一切都是错误的,你最好回到你的C书,当你多了解所有的工作原理时再回来。 –

+0

[这是一个起点](https://stackoverflow.com/questions/16327077)。 – user3386109

回答

3

好像有:-)

复制和long之间char *数据类型不通过转换的数字序列表示的“数字”到像长一个“二进制”数目的一些基本误解; longchar *之间的演员也不会在您的printf陈述中做相反的处理。

转换char*长期使用atol完成的,而打印长控制台通过printf("%ld",l)

好运气和耐心做自己的方式得到一个经验丰富的C程序员,不要犹豫,问: - )

2

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

由于strtol()检测到整数溢出,所以最好使用strtol()而不是atol()errnoerror.h头文件中声明,如果存在溢出,则strtol()将设置值errnostrtol()可以从字符串的开头开始尽可能多地转换字符,并将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