该函数是将二进制表示的字符串转换为十六进制表示的字符串
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
的内容在每次迭代期间不断变化。因为,您基本上是将指针存储到 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");
}
关于c - 为什么我调用这个函数8次,结果都是上次的?在 C 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40253735/