2017-01-30 177 views
-1

我編寫了一個小程序來將char轉換爲long,但是當我嘗試打印char形式時,它已經輸出了錯誤。將IP地址char轉換爲long

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

有很多的不確定的行爲在這裏。你基本上只是將前8個字符複製到一個長插槽並打印一個非空終止的字符指針。真的沒有轉變成長時間的事情,幸運的是打印輸出不會繼續。我建議你閱讀C的入門書 - 也許是K&R書。 – synchronizer

+1

在這裏一切都是錯誤的,你最好回到你的C書,當你多瞭解所有的工作原理時再回來。 –

+0

[這是一個起點](https://stackoverflow.com/questions/16327077)。 – user3386109

回答

3

好像有:-)

複製和long之間char *數據類型不通過轉換的數字序列表示的「數字」到像長一個「二進制」數目的一些基本誤解; longchar *之間的演員也不會在您的printf陳述中做相反的處理。

轉換char*長期使用atol完成的,而打印長控制檯通過printf("%ld",l)

好運氣和耐心做自己的方式得到一個經驗豐富的C程序員,不要猶豫,問: - )

2

這是一個程序,它以輸入字符串的形式獲取IP地址,並將其轉換爲long值。 filter_ip()函數用於首先從字符串中刪除所有非數字字符。然後使用strtol()將字符串轉換爲long值。

由於strtol()檢測到整數溢出,所以最好使用strtol()而不是atol()errnoerror.h頭文件中聲明,如果存在溢出,則strtol()將設置值errnostrtol()可以從字符串的開頭開始儘可能多地轉換字符,並將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