打印由数字和字母组成的 int 数组

Printing int array consisiting of both numbers and letters

我正在用 C 编写一个将十进制整数转换为十六进制的基本函数,但我对数据类型的组合感到困惑。我得到随机数作为输出。

  1. 我知道数组中有字符和数字,但只有数字在打印。
  2. 行不行
char k=j+55;
bb[i] = k;

有待改进?

下面是函数

int decToHex(int b){
    int bb[50];
    int i=0,j=0;
    while(b!=0){
        j=b%16;
        if(j>9){
            char k=j+55;
            bb[i] = k;
        }
        else {
            bb[i] = j;
        }
        b = b/2;
        i++;
    }
    for(j=i-1; j>=0; j--){
        printf("%s",bb[j]);
    }
}

看起来你真的想创建一个字符数组:

char b[50];

这样写可能更清楚

char k = j - 10 + 'A';

你可能想要替换

// bb[i] = j
bb[i] = j + '0'

除以2将用于转换为二进制,您需要除以16:

// b = b / 2;
b = b / 16;

最后输出的行大概应该是

printf("%c", bb[j]);

您可能想在输出循环后打印换行符:

printf("\n");

函数签名需要一个整数 return,但我需要更多信息才能告诉您如何修复它。现在,我们只是 return 零。

通过这些最小的更改,我们得到

#include <stdio.h>

int decToHex(int b){
    char bb[50];
    int i=0,j=0;
    while(b!=0){
        j=b%16;
        if(j>9){
            char k = j - 10 + 'A';
            bb[i] = k;
        }
        else {
            bb[i] = j + '0';
        }
        b = b/16;
        i++;
    }
    for(j=i-1; j>=0; j--){
        printf("%c", bb[j]);
    }
    printf("\n");
    return 0;
}

int main(void) {
    decToHex(1000);
    return 0;
}

输出

3E8

首先,你必须将 b 除以 16。因为它是十六进制。

其次,如果j <= 9,则需要在j中添加'0'(ascii码48)。

而你的函数 return 什么都没有,所以 return 类型必须无效。 bb[j] 是 char,不是 char[]。格式字符串必须是 %c.

解决方案:

#include <stdio.h>

void decToHex(int b) {
    int bb[50];
    int i = 0, j = 0;
    while (b != 0) {
        j = b % 16;
        char k;
        if (j > 9) {
            k = j - 10 + 'A';
        } else {
            k = j + '0';
        }
        bb[i] = k;
        b = b / 16;
        i++;
    }
    for (j = i - 1; j >= 0; j--) {
        char c = bb[j];
        printf("%c", c);
    }
}

如果你想创建一个可以存储 charint 的数组,我们需要一个可以同时容纳两者的特殊类型。我选择了 structunion:

mixed_type.h

#ifndef MIXED_TYPE_H
#define MIXED_TYPE_H

typedef enum {
    CHAR = 0,
    INT
} type_t;

typedef struct {
    type_t type;
    union {
        int number;
        char letter;
    };
} entry_t;

#endif

main.c

#include <stdio.h>
#include "mixed_type.h"

void decToHex(int decimal) {
    int hex_digits = 0, copy_decimal = decimal;
    while (copy_decimal) { ++hex_digits; copy_decimal /= 16; }
    entry_t result[hex_digits];
    int index = hex_digits - 1;
    while (decimal) {
        int nibble = decimal % 16;
        if (nibble >= 10) {
            result[index].type = CHAR;
            result[index].letter = nibble - 10 + 'A';
        }
        else {
            result[index].type = INT;
            result[index].number = nibble;
        }
        --index;
        decimal /= 16;
    }
    for (index = 0; index < hex_digits; index++) {
        if (result[index].type == CHAR)
            printf("%c", result[index].letter);
        else
            printf("%d", result[index].number);
    }
    printf("\n");
}

int main(void) {
    decToHex(1000);
    return 0;
}

输出

3E8

通过将新类型放在单独的头文件中,我们可以使其更易于重用。