Вот программа, которая принимает 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
Там много неопределенное поведение здесь. Вы в основном просто копируете первые 8 символов в длинный слот и печатаете указатель на символ с ненулевым завершением. На самом деле нет никакого преобразования в долгое время, и, к счастью, распечатка не продолжается. Я предлагаю вам прочитать учебник на C - возможно, книгу K & R. – synchronizer
Все здесь не так, вам лучше вернуться к своей книге C и вернуться, когда вы поймете немного больше о том, как все это работает. –
[Здесь отправная точка] (https://stackoverflow.com/questions/16327077). – user3386109