9

キャストを使用してCでintを「文字列」に変換することは可能ですか? atoi()sprintf()?のような機能がなければ

私が欲しいのは次のようなものです:

int main(int argc, char *argv[]) {
    int i = 500;
    char c[4];

    c = (char)i;
    i = 0;
    i = (int)c;
}

その理由は、2 つのランダムな int (0 から 500) を生成し、両方をメッセージ キュー内の 1 つの文字列として別のプロセスに送信する必要があるためです。他のプロセスはメッセージを受信し、LCM を実行します。

atoi()と の使い方を知っていますitoa()。しかし、私の先生はキャストを使いたがっています。

また、以下がコンパイルできないのはなぜですか?

typedef struct
{
    int x;
    int y;
} int_t;

typedef struct
{
    char x[sizeof(int)];
    char y[sizeof(int)];
} char_t;

int main(int argc, char *argv[])
{
    int_t rand_int;
    char_t rand_char;

    rand_int.x = (rand() % 501);
    rand_int.y = (rand() % 501);

    rand_char = (char_t)rand_int;
}
4

6 に答える 6

11

もちろん、配列はオブジェクトであり、ストレージが必要なので、それは不可能です。キャストの結果は、オブジェクトではなくになります。C の全体的なポイント/パワーは、オブジェクトのストレージと有効期間を制御できることだと言う人もいます。

整数の 10 進数表現を含む文字列を生成する適切な方法は、自分でストレージを作成し、次を使用することsnprintfです。

char buf[sizeof(int)*3+2];
snprintf(buf, sizeof buf, "%d", n);
于 2013-05-07T23:14:53.280 に答える
2

正確なコード化された答えを与えることなく、やりたいことは、整数の各桁をループして (% 演算子を使用して剰余 10 を計算することによって)、その値を ASCII 値の '0' に追加することです。結果を char にキャストし、その結果を null で終わる文字列に配置します。

暗黙のキャストが存在しないふりをする例は、次のようになります。

char c = (char) ( ((int) '0') + 5 ); // c should now be '5'.

結果の文字列の長さは、数値の基数 10 の対数を計算するか、realloc() を使用して動的に割り当てることによって決定できます。

于 2013-05-16T22:02:21.767 に答える
2

キャストは、エンディアンのためにこれを行うには恐ろしい方法ですが、とにかくここに例を示します-便利な場合がいくつかあります(ただし、これらのタイプのキャストをコンパイラが処理するため、ユニオンは最近ではうまく機能します)。

#include <stdio.h> //for printf 
#define INT(x) ((int*)(x)) //these are not endian-safe methods
#define CHAR(x) ((char*)(x))
int main(void)
{
    int *x=INT(&"HI !");
    printf("%X\n",*x); //look up the ascii and note the order
    printf("%s\n",CHAR(x));
    return 0;
}

値が 500 未満の int の場合、最上位バイトが最初に来ると、"" (または {0})の"string" (char 配列へのポインター) を取得しますが、エンディアンが LSB ファーストの場合 (x86 はリトルエンディアン) を使用すると、使用可能な 3 バイトの「文字列」 char* (人間が読める文字とは限りません) を取得できますが、整数にゼロバイトが含まれるという保証はありません。 int が格納されていた場合、通常の文字列関数を実行すると、元の int の末尾を越えて無人地帯に入ります (小さなテスト プログラムでは、多くの場合、環境変数になります) ...とにかく詳細についてはネットワーク バイト オーダーを使用できる移植性 (リトル エンディアンの場合はノーオペレーション):

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

これらの関数は、ネットワーク バイト オーダーを取得するために、必要に応じてバイトスワップするだけです。x86 では最適化されているため、移植性のために使用することもできます。

于 2014-07-20T05:30:32.467 に答える
1

まだリストされていないという理由だけで: を使用して、可変サイズの割り当てで int を char 配列に変換する方法を次に示しますsnprintf

int value = 5

// this will just output the length which is to expect
int length = snprintf( NULL, 0, "%d", value );

char* valueAsString = malloc( length + 1 );// one more for 0-terminator
snprintf( valueAsString, length + 1, "%d", value );
于 2016-08-10T11:30:08.667 に答える