为什么我调用这个函数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。请注意,在这里说“谢谢”的首选方式是投票选出好的问题和有帮助的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有帮助的答案(这也会给你的声誉带来一点提升)。请参阅本页及