-2

私の仕事は、浮動小数点数または整数値をCの文字列に変換することです。組み込みプラットフォームで作業しているため、sprintf を使用できません。そこで、こんな使い方を考えました。

#define CURRENT(STRING,S_NO,VALUE) (str = "S"#S_NO#VALUE"A") 

そして、このように呼び出します

int a=10,b=20;
CURRENT(str,a,b);

したがって、 str は である必要がありますS1020A。しかし、私は得てSabAいます。

ここで何が間違っていますか?

4

2 に答える 2

3

マクロはコンパイル前に評価されるためCURRENT(str,a,b);、変数名を使用して展開され、実行時にのみ使用できる可能性のある値ではありませんab

を使用せずに実行時に配列に変換するintには、利用可能な場合はitoaを使用するか、次のような関数を記述できます (テストされていません!)。charsprintf

#define MAX_INT_STRING_BYTES (11)

void IntToString(int val, char* str)
{
    char reversed[MAX_INT_STRING_BYTES]
    int index, i = 0;
    bool negative = false;
    if (val == 0) {
        *str++ = '0';
        *str = '\0';
        return;
    }
    if (val < 0) {
        negative = true;
    }
    while(val != 0) {
        reversed[index++] = (char)('0' + abs(val % 10));
        val /= 10;
    }
    if (negative) {
        *str++ = '-';
    }
    for (i = index; i > 0; i--) {
        *str++ = reversed[i - 1]);
    }
    *str = '\0';
}
于 2013-02-01T15:43:57.510 に答える
2

a と b の値は実行時にのみ認識され、プリプロセッサ ディレクティブはコンパイル時に解決されます。したがって、あなたがやろうとしていることはうまくいきません。

ただし、次のようなことができます。

#define CURRENT(STRING,S_NO,VALUE) sprintf(STRING, "S%i%iA", S_NO, VALUE)

または、関数にするだけです。

または、CURRENT の代わりに sprintf を直接呼び出します。

于 2013-02-01T15:41:57.683 に答える