1

デバッグしようとしているプログラムがありますが、Dynamic C は文字列を通常の C とは異なる方法で処理しているようです (とにかく、文字配列です)。8 ビットの char 変数の内容を表示するために、0 と 1 の 8 文字の長さ (\0 を含めると 10 文字) の文字列を作成するために作成した関数があります。(IE、13 という数字を指定すると、文字列 "0001101\0" が返されます)

以下のコードを使用すると、!{happy face] が 6 回出力され (まあ、2 回目は何らかの理由で幸せそうな顔だけです)、それぞれの戻り値は 0xDEAE または "!\x02.

逆参照して適切な文字列を返すと思っていましたが、ポインターを送信して解析しようとしているだけのようです。これはばかげているように思えるかもしれませんが、私の経験は実際には C++ と Java であったため、C に戻ると、後のプログラミング言語で対処されたいくつかの問題が発生し、対処方法が完全にはわかりません (文字列の欠如など)変数)。

このコードをどのように修正できますか、または私がやろうとしていることを行うためのより良い方法はどうすればよいでしょうか (おそらく文字配列へのポインターを送信して関数からそれを処理することができると思いましたが、質問する必要があると思いました)車輪の再発明を試みているだけかどうかを確認するため)。

現在、私は次のように設定しています:

これは main() からの抜粋です

display[0] = '\0';
for(i=0;i<6;i++)
{
     sprintf(s, "%s ", *char_to_bits(buffer[i]));
     strcat(display, s);
}
DispStr(8,5, display);

そして、これは問題のある機能です:

char *char_to_bits(char x)
{
     char bits[16];
     strcpy(bits,"00000000\0");
     if (x & 0x01)
         bits[7]='1';
     if (x & 0x02)
         bits[6]='1';
     if (x & 0x04)
         bits[5]='1';
     if (x & 0x08)
         bits[4]='1';
     if (x & 0x10)
         bits[3]='1';
     if (x & 0x20)
         bits[2]='1';
     if (x & 0x40)
         bits[1]='1';
     if (x & 0x80)
         bits[0]='1';
     return bits;
}

完成させるために、他の関数を使用して stdio ウィンドウの特定の場所に出力します。

void DispStr(int x, int y, char *s)
{
     x += 0x20;
     y += 0x20;
     printf ("\x1B=%c%c%s", x, y, s);
}
4

4 に答える 4

4

私が見ることができる問題は次のとおりです。

  • 関数は である配列をchar_to_bits返します 。したがって、関数が戻ると、そのメモリは失われます。これを解決するには、動的に使用してビットにメモリを割り当て、後で関数を使用して解放するか、グローバルに作成または宣言することができます。charbitslocalmallocfreestaticbits
  • char_to_bitsの呼び出しを逆参照する必要はありません sprintf。だから変える
    sprintf(s, "%s ", *char_to_bits(buffer[i]));

    sprintf(s, "%s ", char_to_bits(buffer[i]));

于 2010-04-02T16:25:38.573 に答える
2
char * func()
{
  char *str = malloc (string_size * sizeof(char));
  strncpy (str, "Hello World", string_size);
  return str;
}


main()
{
  char *str = func();
  printf ("%s\n", str);
  free(str);
}
于 2010-04-02T16:23:52.723 に答える
1

あなたの問題はchar bits[16];、関数に対してローカルchar_to_bitsであるため、返されたときに無効なスタックの場所を指していることです。文字列で埋めたいバッファを渡す必要があります。そのようです:

char * char_to_bits(char x, char * bits)
{
     strcpy(bits,"00000000\0");
     ...
     return bits;
}

そして次のような呼び出し:

 char bits[16];
 sprintf(s, "%s ", char_to_bits(buffer[i], bits));

この点で、Dynamic C ( this? )ここの C と同じように動作しています。これは、Java/C++ 文字列に慣れている人が犯すよくある間違いです。AC「文字列」は、オブジェクトではなく、単なるデータへのポインタです。

于 2010-04-02T16:24:08.090 に答える
0

bits[]問題は、配列 fromchar *char_to_bits(char x)がローカルで宣言され、グローバルに宣言されているという事実である可能性があります。

このプログラムを試してみてください。Mingw と Borland/CodeGear コンパイラの両方を使用してテストしましたが、動作します。

#include <stdio.h>
#include <string.h>

using namespace std;

//Declare bits[] globally
char bits[16];

//Your char to bit function
char* char_to_bits(char x)
{

     strcpy(bits,"00000000\0");
     if (x & 0x01)
         bits[7]='1';
     if (x & 0x02)
         bits[6]='1';
     if (x & 0x04)
         bits[5]='1';
     if (x & 0x08)
         bits[4]='1';
     if (x & 0x10)
         bits[3]='1';
     if (x & 0x20)
         bits[2]='1';
     if (x & 0x40)
         bits[1]='1';
     if (x & 0x80)
         bits[0]='1';
     return bits;
}

int main()
{
    //Testing char_to_bits() by writing word "Test" in binary

    char test[] = "Test";

    for(int i = 0; i < strlen(test); i++)
    {
        printf("%s ", char_to_bits(test[i]));
    }

    return 0;
}
于 2010-04-02T16:24:12.520 に答える