2017-01-30 8 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턾U

+0

未定義の動作の多くはここにあります。あなたは基本的に最初の8文字を長いスロットにコピーして、ヌルで終わらない文字ポインタを出力しています。長い間起こっている変換は実際にはなく、プリントアウトが続かないのは幸いです。私はあなたがCの下絵を読むことをお勧めします - おそらくK&R本。 – synchronizer

+1

すべてが間違っているので、Cブックに戻って、そのすべてがどのように動作するのかをもう少し理解したときに戻ってくるのがよいでしょう。 –

+0

[こちらが出発点です](https://stackoverflow.com/questions/16327077) – user3386109

答えて

3

は、いくつかの基本的な誤解は

コピーchar *longデータ型:-)あるかのように長いような「バイナリ」番号に数字の配列で表される「番号」を変換しないようです。 longからchar *までのキャストはどちらもあなたのprintfの記述にはありません。 longにchar*の変換

は、atolを使用して行われ、経験豊富なCプログラマを得るためにあなたの方法に

幸運と忍耐printf("%ld",l)を介して行われ、そして尋ねることを躊躇しないでコンソールに長いを印刷するのに対し: - )

2

ここでは、入力文字列の形式でIPアドレスを取得し、それをlong値に変換するプログラムです。 filter_ip()関数は、最初に文字列から数値以外の文字をすべて削除するために使用されます。次にstrtol()を使用して、文字列をlongの値に変換します。

strtol()は整数オーバーフローを検出するため、よりも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 
関連する問題