c - 为什么我调用这个函数8次,结果都是上次的?在 C 中

标签 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];
    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;
}

Main函数调用tohex函数8次

int main (int argc, char**argv)
{
char *dl_hex[8];
char dl_bny[8][32];

for (i=0;i<8;i++) {
    dl_hex[i] = tohex(dl_bny[i]);
 }
}

for (i=0;i<8;i++) {
    for (j=0;j<8;j++){
        printf("%c",*(dl_hex[i]+j));
    }
        printf("\n");
}

打印完所有的dl_hex后,结果都和dl_hex[7]一样,如果我把循环次数改成6次,结果都是dl_hex[5],好像不管调用多少次tohex函数, 所有结果都将用于最后一个。

最佳答案

您正在从函数 tohex 返回一个指向静态缓冲区 hexout 的指针。静态缓冲区 hexout 的内容在每次迭代期间不断变化。因为,您基本上是将指针存储到 hexoutdl_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");
}

关于c - 为什么我调用这个函数8次,结果都是上次的?在 C 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40253735/

相关文章:

loops - awk 拆分更多列并打印第一个单词

C - 数字中数字的位置

c++ - DirectShow 的 SampleGrabber 检索错误样本

javascript - jquery - 未定义函数 - 从内联脚本调用此函数

javascript - 使用拼接替换所有找到的项目

sql - mysql中一个月的星期几的函数

Python 使用 *args 填充函数的输入参数

c - 指向指针的指针?

c - 为什么我的 fscanf 似乎没有读取任何内容?

c - 我怎样才能使字数统计程序(来自 K&R)在一次应用 CTRL-D 后终止?