我编写了一个小程序来将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턾û
我知道我错过了一些简单的东西,但我正在画一个空白。
答案 0 :(得分:3)
似乎有一些基本的误解: - )
在 var y = d3.scale.ordinal()
.rangeRoundBands([height, 0], 0.35);
var x = d3.scale.linear()
.rangeRound([0, width]);
和char *
数据类型之间复制不会将由数字序列表示的“数字”转换为“二进制”数字,如long;从long
到long
的演员都不会在你的char *
陈述中做相反的事。
使用printf
将char*
转换为long,而通过atol
在获得经验丰富的C程序员的路上祝你好运和耐心,并且毫不犹豫地问: - )
答案 1 :(得分:2)
这是一个以输入字符串形式获取IP地址并将其转换为long
值的程序。 filter_ip()
函数用于首先从字符串中删除所有非数字字符。然后strtol()
用于将字符串转换为long
值。
最好使用strtol()
而不是atol()
因为strtol()
检测到整数溢出。 errno
头文件中声明了error.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