2017-09-26 14 views
0

整数をchar *ポインタに変換しようとしているので、引数を別の関数に適切に送ることができます。 atoiなしでこれを行うには、とにかくありますか?Intをchar *ポインタに変換する

int number=2123, number2= 1233; 
char* arg[]; 

arg[0] = number; 
arg[1] = number2; 

**ので、基本的に、私は引数をしたい私はこのような機能にそれを送ることができるように、[0]、数の文字列の担当者に等しくなるように明確なものをしていないため申し訳ありません:変換(char型*の引数);

私は、パラメータのデータ型を変更するだろうが、それはに送信するためにそのポインタである必要があります。

+0

したがって、上記のように "2123"や "1233"のように、arg []の引数を文字列表現にしたいとしますか? – Joe

+0

あなたは混乱しています。実際にその数値を文字表現に変換したいのですか(この場合、sprintf()のようなものが必要です)?または、char *をとる関数が整数のアドレスをどうするかを知っていますか?また、arg []、arg [0]、arg [1]のためにメモリを割り当てる必要があります。 –

+1

最初に 'atoi'を使用できないのはなぜですか? – myaut

答えて

0

あなたはポインタは常に整数と少なくとも同じ大きさであると仮定した場合(これへの例外がある?)あなたは安全にこれらのマクロをバックポインタを整数に変換することができ:

#define INT2POINTER(a) ((char*)(intptr_t)(a)) 
#define POINTER2INT(a) ((int)(intptr_t)(a)) 

か、そのほかの機能はあなたの関数ではなく、文字列として整数を望んでいる機能は、あなたが(asprintfを使用することができます)このような場合:

asprintf(&arg[0],"%d",number); 
asprintf(&arg[1],"%d",number2); 

しかし、それは上で使用できない場合がありますので、asprintfはPOSIX標準ではありませんすべてのシステム。代わりにsprintf()(またはsnprintf()を使用して安全な側に置くこともできます)が、最初に文字列の長さを計算する必要があります。

0

私は適切に別の関数に引数を送ることができるようにchar*ポインタに整数に変換します。

数を変換するリテラル化合物を介してchar配列とヘルパー関数を呼び出すことにより、数値のストリング表現を作成します。文字列は関数とコードブロックの最後に有効です。ストリングの適切なサイジングは重要です。それを別のエクササイズに任せてください。ここでのコードは、128ビットの場合は012を使用します。int。このような小さなバッファに対しては、malloc()/free()を介したメモリ管理の必要はありません。

char *my_revstr(char *str) 
{ 
    int i; 
    int j; 
    char tmp; 

    i = -1; 
    j = strlen(str); 
    while (++i < j) 
    { 
     tmp = str[i]; 
     str[i] = str[--j]; 
     str[j] = tmp; 
    } 
    return (str); 
} 

そしてget_int_lenght機能:revstr機能で

char *int_to_char(int nb) 
{ 
    int div; 
    char *str; 
    int i; 
    int size; 
    int sign; 

    i = -1; 
    sign = 1; 
    size = get_int_lenght(nb); 
    if (!(str = malloc(sizeof(char) * (size + 1)))) 
    return (NULL); 
    if (nb < 0) 
    { 
     sign *= -1; 
     nb *= -1; 
    } 
    if (nb == 0) 
    { 
     str[++i] = '0'; 
     str[i + 1] = 0; 
     return (str); 
    } 
    while (nb > 0) 
    { 
     str[++i] = (nb % 10) + '0'; 
     nb /= 10; 
    } 
    if (sign < 0) 
    str[++i] = '-'; 
    str[i + 1] = 0; 
    return (my_revstr(str)); 
} 

:ここに出力

<2123> <1233> 
<-2147483648> <0> <2147483647> 
+0

*「itoa」と呼んでください! –

+0

@SteveSummit .ekatsim a saw tahT。コードが修正されました。 – chux

-2

char *my_itoa(char *dest, int i) { 
    sprintf(dest, "%d", i); 
    return dest; 
} 

#define ITOA(n) my_itoa((char [41]) { 0 }, (n)) 

int main(void) { 
    int number=2123, number2= 1233; 
    printf("<%s> <%s>\n", ITOA(number), ITOA(number2)); 
    printf("<%s> <%s> <%s>\n", ITOA(INT_MIN), ITOA(0), ITOA(INT_MAX)); 
} 

が探している再機能あなた」である

int  get_int_lenght(int nb) 
{ 
    int size; 

    size = 0; 
    if (nb <= 0) 
    { 
     size++; 
     nb *= -1; 
    } 
    while (nb > 0) 
    { 
     size++; 
     nb /= 10; 
    } 
    return (size); 
} 
+0

while(nb> 0) 'は負の' int'と '0'の問題です。 – chux

+0

この関数は、結果の文字列を保持するためにヒープメモリを割り当てます。これは必ずしも悪いことではありませんが、呼び出し元がメモリを解放してメモリリークを回避できるように文書化する必要があります。 –

+0

うん、それは更新され、それは私のために働く:) – YaatSuka

関連する問題