1

我有一个我正在尝试调试的程序,但 Dynamic C 显然对字符串的处理方式与普通 C 不同(好吧,无论如何,字符数组)。我有一个函数,我制作了一个 8 字符长(好吧,10 包括 \0 )字符串 0 和 1,以显示 8 位 char 变量的内容。(IE,我给它编号 13,它返回字符串 "0001101\0" )

当我使用下面的代码时,它会打印出 !{happy face] 6 次(嗯,由于某种原因,第二个是单独的快乐脸),每个返回都以 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返回的 char数组bitslocal. 所以一旦函数返回,它的内存就会丢失。要解决此问题,请动态使用为位分配内存,malloc然后使用该函数将其释放,free或者您可以全局创建static或声明。bits
  • 您无需取消 char_to_bitssprintf. 所以改变
    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 回答