這是一個程序,它以輸入字符串的形式獲取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