为什么C会输出这些克拉?

为什么C会输出这些克拉?,c,C,我正在写一个十六进制到base64的编码器作为练习,因为我是C语言的新手。不管为什么代码没有按我希望的方式工作,为什么我在输出旁边有这些克拉字母组合 const char * hex_to_base64(const char * s) { int i; for(i = 0; i < strlen(s)/3; i = i + 3) { char str[3]; str[0] = s[i]; str[1] = s[i+1]; str[2] = s[i+2

我正在写一个十六进制到base64的编码器作为练习,因为我是C语言的新手。不管为什么代码没有按我希望的方式工作,为什么我在输出旁边有这些克拉字母组合

const char * hex_to_base64(const char * s) {
  int i;
  for(i = 0; i < strlen(s)/3; i = i + 3) {
    char str[3];
    str[0] = s[i];
    str[1] = s[i+1];
    str[2] = s[i+2];
    printf("%s\n", str);
  }
  return NULL;
}

int main() {
  const char * x = "4453def6d206b696c6c696e6720796f757220627261696e206c696b652061222226f789436f6e6f5573206dabb7368726fa4b2";
  hex_to_base64(x);
  return 0;
}
有人能解释一下为什么我会在printf的末尾得到克拉字母组合吗

char str[3];
str[0] = s[i];
str[1] = s[i+1];
str[2] = s[i+2];
printf("%s\n", str);
str
应以null结尾。您必须将
str
声明更改为:

char str[4] = {0};
str
应以null结尾。您必须将
str
声明更改为:

char str[4] = {0};

您正在将以非零结尾的字符串传递给printf()。更改:


更好的是,将声明和零赋值移到循环之外。

您正在将一个非以零结尾的字符串传递给printf()。更改:


更好的是,将声明和零赋值移到循环之外。

其他人已经指出了您程序中的错误,但您的问题是“为什么我要得到克拉字母组合”,答案是插入符号字母组合是您的终端对您尝试打印的各种非打印字符的表示(由于上述错误)。

其他人已经指出了您程序中的错误,但您的问题是“为什么我要获得克拉字母组合”,答案是插入符号字母组合是您的终端对您尝试打印的各种非打印字符的表示(由于上述错误)。

这些必须是控制字符的十六进制代码。我认为您的循环在任何情况下都有缺陷。如果
s
长度为30个字符,
i
0
3
6
9
12
,循环结束。这些必须是控制字符的十六进制代码。我认为您的循环无论如何都有缺陷。如果
s
长度为30个字符,
i
0
3
6
9
12
,循环结束。我不认为这是真的。以这种方式馈送到终端的程序输出不是后处理。这仅适用于终端处于烹调模式时用户输入的回声。我认为OP系统上
str[2]
后面的内存位置一定包含了一个实际的
^
字符。那么,对于随机内存来说,这是一个非常一致的
^
符号。非打印字符以这种方式表示的另一种方式是,如果输出被重定向到一个文件,并且该文件正在使用vi进行查看。那么,每次都是相同的调用堆栈,这意味着每次都是相同的内存位置,所以似乎也有相同的内容。但是输出被重定向的好处是,我不认为这是真的。以这种方式馈送到终端的程序输出不是后处理。这仅适用于终端处于烹调模式时用户输入的回声。我认为OP系统上
str[2]
后面的内存位置一定包含了一个实际的
^
字符。那么,对于随机内存来说,这是一个非常一致的
^
符号。非打印字符以这种方式表示的另一种方式是,如果输出被重定向到一个文件,并且该文件正在使用vi进行查看。那么,每次都是相同的调用堆栈,这意味着每次都是相同的内存位置,所以似乎也有相同的内容。但是输出被重定向的好处是。
char str[3];
char str[4];
str[3] = '\0';