2017-01-30 20 views
-1

Я написал небольшую программу для преобразования символа в длинный, однако, когда я пытаюсь напечатать форму char, у него есть искаженный вывод.Преобразование IP-адреса 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 턾 U

Я знаю, что я пропускаю что-то простое, но я рисую пробел.

+0

Там много неопределенное поведение здесь. Вы в основном просто копируете первые 8 символов в длинный слот и печатаете указатель на символ с ненулевым завершением. На самом деле нет никакого преобразования в долгое время, и, к счастью, распечатка не продолжается. Я предлагаю вам прочитать учебник на C - возможно, книгу K & R. – synchronizer

+1

Все здесь не так, вам лучше вернуться к своей книге C и вернуться, когда вы поймете немного больше о том, как все это работает. –

+0

[Здесь отправная точка] (https://stackoverflow.com/questions/16327077). – user3386109

ответ

3

Кажется, как будто есть некоторые основные недопонимания :-)

Копирование между char * и long типа данных не преобразует «номер», представленную последовательностью цифр в двоичный «» номер, как долго; ни один из них от long до char * не делает противоположного в вашем printf -ступенчатом.

Преобразование char* долго производится с помощью atol, в то время как печать долго утешать осуществляется через printf("%ld",l)

удачи и терпения на вашем пути, чтобы получить опытный программист, и не стесняйтесь обращаться к нам: -)

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 

 Смежные вопросы

  • Нет связанных вопросов^_^