如何在C语言中将字符数组转换为二进制数组

如何在C语言中将字符数组转换为二进制数组,c,binary,arrays,C,Binary,Arrays,我知道这个问题似乎很熟悉,但并不完全相同。我正在将字符数组转换为二进制整数。作为第二步,我尝试将它们连接到一个整数数组中。我正在将整数转换回字符,以便连接它们。脚本似乎工作正常,但由于某些原因,我无法理解当我打印整个字符串时,它会在字符串的开头生成一个不可打印的字符 代码示例: #include <stdio.h> #include <string.h> int main(void) { char *temp; char str[2]; char fina

我知道这个问题似乎很熟悉,但并不完全相同。我正在将字符数组转换为二进制整数。作为第二步,我尝试将它们连接到一个整数数组中。我正在将整数转换回字符,以便连接它们。脚本似乎工作正常,但由于某些原因,我无法理解当我打印整个字符串时,它会在字符串的开头生成一个不可打印的字符

代码示例:

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

int main(void) {

  char *temp;
  char str[2];
  char final[32];

  for (temp = "LOCL"; *temp; ++temp) {
    int bit_index;
    for (bit_index = sizeof(*temp)*8-1; bit_index >= 0; --bit_index) {
      int bit = *temp >> bit_index & 1;
      printf("%d ", bit);

      snprintf(str, 2, "%d", bit);
      printf("This is test: %s\n",str);
      strncat(final , str , sizeof(final) );
    }
    printf("\n");
  }
  printf("This is the array int: %s\n",final);

  return 0;
}
#包括
#包括
内部主(空){
字符*温度;
char-str[2];
char final[32];
对于(temp=“LOCL”;*temp;++temp){
int位索引;
用于(位索引=sizeof(*temp)*8-1;位索引>=0;--位索引){
int位=*temp>>位索引&1;
printf(“%d”,位);
snprintf(str,2,“%d”,位);
printf(“这是测试:%s\n”,str);
strncat(最终版本、str、sizeof(最终版本));
}
printf(“\n”);
}
printf(“这是数组int:%s\n”,final);
返回0;
}
有人能帮我理解我哪里出了问题吗


提前感谢您花时间和精力来帮助我。

您只是忘记初始化
final
,所以在运行代码时,您正在将二进制字符串连接到
final
中的任何垃圾上。您还需要在
final
中留出一个额外的字符(以容纳
'\0'
终止符)。更改:

致:


您只是忘记初始化
final
,因此在运行代码时,您正在将二进制字符串连接到
final
中的任何垃圾上。您还需要在
final
中留出一个额外的字符(以容纳
'\0'
终止符)。更改:

致:



final[32]可能太小,小于1。@PaulR-创建
char final[33]后
final[0]=0是否有效在下一行?,(或者只使用memset())@ryker:如果你愿意,你可以这样做,尽管写
final[0]='\0'可能在风格上更好一些
memset
似乎有些过火了。@PaulR天哪……你说得绝对正确。工作完美这是我唯一没有测试的东西。我的印象是,我正在以某种方式修改二进制数据。非常简单,我尝试了5种不同的解决方案,其中没有一种有效。非常感谢。我没有在末尾添加
\0
字符的原因是我计划将此字符串与后面的另一个字符串连接起来,因此我需要它正好是32位。再次感谢您花时间和精力帮助我。@Thanos:很高兴它能为您工作-调试时发现您正在处理“错误”问题是很常见的,通常是由于错误的假设。这也发生在我身上,我做这件事已经30多年了(你可能认为我现在已经学会了!)。
final[32]可能太小,小于1。@PaulR-创建
char final[33]后
final[0]=0是否有效在下一行?,(或者只使用memset())@ryker:如果你愿意,你可以这样做,尽管写
final[0]='\0'可能在风格上更好一些
memset
似乎有些过火了。@PaulR天哪……你说得绝对正确。工作完美这是我唯一没有测试的东西。我的印象是,我正在以某种方式修改二进制数据。非常简单,我尝试了5种不同的解决方案,其中没有一种有效。非常感谢。我没有在末尾添加
\0
字符的原因是我计划将此字符串与后面的另一个字符串连接起来,因此我需要它正好是32位。再次感谢您花时间和精力帮助我。@Thanos:很高兴它能为您工作-调试时发现您正在处理“错误”问题是很常见的,通常是由于错误的假设。这也发生在我身上,我做这件事已经30多年了(你认为我现在已经学会了!)。你知道
>
&
*temp>>位索引&1
中的相对优先级吗?编译器知道吗?你们俩意见一致吗?我强烈建议使用括号,以方便后面的人,即使你直接知道答案。另外,也许你应该显示你得到的输出和你想要的输出。这可能会使人们更容易帮助您。请注意,您正在告诉
strncat()
,可以在
final
中已存储的任何字符串的末尾写入
sizeof(final)
个字符。
strncat()
的接口甚至比
strncpy()的接口更糟糕;要获得正确的代码是非常困难的,您必须知道目标中的字符串有多长,然后才能说出还有多少空间,这实际上使它变得毫无意义(您可以使用
memmove()
memcpy()
strcpy()
strcpy()
)。我忘了存在
strncpy()
——我只在人们询问堆栈溢出时使用它;应该是char final[32]={'\0'};因此字符串总是以null结尾;应为char str[3];因此,存在终止空值的空间。每次迭代都应该将str数组重新初始化为此行的所有“\0”:strncat(final,str,sizeof(final));几乎总是会失败,因为它会一直放置str和final中的字符,直到找到null或添加32个字符。建议改为strncat(最终,str,2);您知道
>>
&
*temp>>位索引&1
中的相对优先级吗?编译器知道吗?你们俩意见一致吗?我强烈建议使用括号,以方便后面的人,即使你直接知道答案。分离
char final[32];
char final[33] = "";