这是一个程序,它以输入字符串的形式获取IP地址,并将其转换为long
值。 filter_ip()
函数用于首先从字符串中删除所有非数字字符。然后使用strtol()
将字符串转换为long
值。
由于strtol()
检测到整数溢出,所以最好使用strtol()
而不是atol()
。 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
有很多的不确定的行为在这里。你基本上只是将前8个字符复制到一个长插槽并打印一个非空终止的字符指针。真的没有转变成长时间的事情,幸运的是打印输出不会继续。我建议你阅读C的入门书 - 也许是K&R书。 – synchronizer
在这里一切都是错误的,你最好回到你的C书,当你多了解所有的工作原理时再回来。 –
[这是一个起点](https://stackoverflow.com/questions/16327077)。 – user3386109