为什么我调用这个函数8次,所有结果都是上次的?在C中
此函数用于将表示二进制的字符串转换为表示十六进制的字符串为什么我调用这个函数8次,所有结果都是上次的?在C中,c,function,loops,call,C,Function,Loops,Call,此函数用于将表示二进制的字符串转换为表示十六进制的字符串 char *tohex(char bnyin[32]) { static char hexout[8]; int i=0; int j=0; for (i=0;i<8;i++){ char txt[4]; char hex; txt[0] = bnyin[i*4+0]; txt[1] = bnyin[i*4+1]; txt[2] = bnyin[i*4+2];
char *tohex(char bnyin[32]) {
static char hexout[8];
int i=0;
int j=0;
for (i=0;i<8;i++){
char txt[4];
char hex;
txt[0] = bnyin[i*4+0];
txt[1] = bnyin[i*4+1];
txt[2] = bnyin[i*4+2];
txt[3] = bnyin[i*4+3];
switch (atoi(txt)) {
case 0: hex = '0'; break;
case 1: hex = '1'; break;
case 10: hex = '2'; break;
case 11: hex = '3'; break;
case 100: hex = '4'; break;
case 101: hex = '5'; break;
case 110: hex = '6'; break;
case 111: hex = '7'; break;
case 1000: hex = '8'; break;
case 1001: hex = '9'; break;
case 1010: hex = 'a'; break;
case 1011: hex = 'b'; break;
case 1100: hex = 'c'; break;
case 1101: hex = 'd'; break;
case 1110: hex = 'e'; break;
case 1111: hex = 'f'; break;
}
hexout[i] = hex;
}
return hexout;
}
char*tohex(char bnyin[32]){
静态字符hexout[8];
int i=0;
int j=0;
对于(i=0;i您返回一个静态缓冲区,那么它对于所有调用都是相同的,然后将包含最后生成的值
例如,每次调用tohex
,只需复制返回的结果即可:
char dl_hex[8][9];
...
strcpy(dl_hex[i], tohex(dl_bny[i]));
注意,如果您的代码在某些地方出错:dl_bny
未初始化,字符串必须包含最后的0,因此长度应为33…如果您返回一个静态缓冲区,则它对所有调用都是相同的,然后将包含最后生成的值
例如,每次调用tohex
,只需复制返回的结果即可:
char dl_hex[8][9];
...
strcpy(dl_hex[i], tohex(dl_bny[i]));
如果代码在某些地方出错,请注意:dl_bny
未初始化,字符串必须包含最后的0,因此长度应为33…您正在从函数返回指向静态缓冲区hexout
的指针。静态缓冲区hexout
的内容在每次迭代过程中不断变化。S因为,您基本上是在存储指向hexout
的指针。dl_hex
的所有插槽将包含相同的指针(指向hexout),因此将包含与上次运行期间获得的值相同的值
最好的方法是复制这些值
将代码的主要功能更改如下:
int main (int argc, char**argv)
{
char dl_hex[8][8];
char dl_bny[8][32];
for (i=0;i<8;i++) {
strncpy(dl_hex[i],tohex(dl_bny[i]), 8);
}
}
for (i=0;i<8;i++) {
for (j=0;j<8;j++){
printf("%c",*(dl_hex[i]+j));
}
printf("\n");
}
int main(int argc,char**argv)
{
char dl_hex[8][8];
char dl_bny[8][32];
对于(i=0;i您正在从函数tohex
返回指向静态缓冲区hexout
的指针。静态缓冲区hexout
的内容在每次迭代过程中不断变化。因为,您基本上是在存储指向hexout
的指针。dl\u hex
的所有插槽都将包含相同的指针(到hexout),因此将包含与上次运行期间获得的值相同的值
最好的方法是复制这些值
将代码的主要功能更改如下:
int main (int argc, char**argv)
{
char dl_hex[8][8];
char dl_bny[8][32];
for (i=0;i<8;i++) {
strncpy(dl_hex[i],tohex(dl_bny[i]), 8);
}
}
for (i=0;i<8;i++) {
for (j=0;j<8;j++){
printf("%c",*(dl_hex[i]+j));
}
printf("\n");
}
int main(int argc,char**argv)
{
char dl_hex[8][8];
char dl_bny[8][32];
对于(i=0;istrcpy可能无法工作,因为字符数组的内容似乎没有以“\0”结尾。@Jean BaptisteYunès感谢您的回答,它工作得很好!虽然dl_bny在其他地方初始化了,但您提到的内容确实解决了我关于“\0”结尾的另一个问题!非常感谢!strcpy可能无法作为字符数组的内容字符数组似乎没有以“\0”结尾。@Jean BaptisteYunès感谢您的回答,它工作得很好!虽然dlèbny是在其他地方初始化的,但您提到的内容确实解决了我关于“\0”结尾的另一个问题!感谢您的回答和解释!我尝试了strncpy,然后得到了正确的结果。我想知道,对于第一次迭代,为什么第一个插槽不立即获取第一个指针,然后转到第二次迭代?对于我的情况,编译器似乎首先调用函数8次,然后将这8个结果分配给8个插槽?感谢您的回答和解释!我尝试了strncpy,然后得到了正确的结果。我是w因此,对于第一次迭代,为什么第一个槽不立即获取第一个指针,然后转到第二次迭代呢?对于我的例子,编译器似乎一开始调用函数8次,然后将这8个结果分配给8个槽?欢迎使用堆栈溢出。请注意,说“谢谢”的首选方式是这是通过投票选出好的问题和有用的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有用的答案(这也会给你的声誉带来一点提升)。请参阅该页面,也欢迎使用Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票选出好的问题和有帮助的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有帮助的答案(这也会给你的声誉带来一点提升)。请参阅本页及