如何在C中显示数组

时间:2013-02-16 01:02:56

标签: c arrays printf

#include<stdio.h>

int main()
{
int input = 0;
int binaryNumber = 0;
int decimalNumber = 0;
int remainder = 0;
int i = 1;
int wholeNumber = 0;\
int number = 0;
char hexLetters[] = "ABCDEF";


printf("Press 1 to convert Binary to Hex\n");
printf("Press 2 to convert Hex to Binary\n");
printf("Press 3 to convert Decimal to 2's to Compliment Binary\n");
scanf("%d",&input);
printf("\n");

switch (input)
{
    case 1:
    {

    printf("Enter a Binary number\n");
    scanf("%d",&binaryNumber);

    char binaryToHex[2];
    while(binaryNumber != 0)
    {
        remainder = binaryNumber%10;
        decimalNumber = decimalNumber + (remainder*i);
        i = i*2;
        binaryNumber = binaryNumber/10;
    }
    while(decimalNumber != 0)
    {
    remainder = decimalNumber%16;
    wholeNumber = (decimalNumber%16)-(remainder/16);

    decimalNumber = 0;
    }

    int j = 1;
    for(j=1;j<16;j++){
        if(remainder ==j){
            binaryToHex[1] = hexLetters[j-10];
        }
        else{
            binaryToHex[1] = remainder;
        }
    }

    int k = 1;
    for(k=1;k<16;k++){
        if(wholeNumber == k){
            binaryToHex[0] = hexLetters[k-10];
        }
        else{
            binaryToHex[0] = wholeNumber;
        }
    }

    printf("%c%c\n", binaryToHex[0], binaryToHex[1]);

请帮助什么都不会显示,经过一些修补后,只有F显示哪个是 错误。我已经检查过以确保余数和整数都正常工作并且它确实得到了正确的数字但是当我尝试将信件存储到binaryToHex时,它总是F或它什么都没有。请帮助

2 个答案:

答案 0 :(得分:0)

最大的问题可能出在这一行:

binaryToHex[1] = remainder;

binaryToHex[0]语句的simiar。这应该是一个角色(当它是A-F时)。相反,在这里,您要分配一个数字。这将导致打印与该数字对应的ASCII字符,对于0-9,该字符在不可打印的值范围内(NUL-TAB)。

ASCII整数从48开始为'0'。因此,一种解决方法是在形成最终输出时向remainderwholeNumber变量添加48,(或删除所有“幻数”,“0”),例如

binaryToHex[1] = remainder + '0';

另一个问题(我刚刚意识到)是你的循环。

for(k=1;k<16;k++){
    if(wholeNumber == k){
        binaryToHex[0] = hexLetters[k-10];
    }
    else{
        binaryToHex[0] = wholeNumber;
    }
}

所以,快速思考一下。对于1-16,如果数字匹配,则为其指定十六进制字母,否则,指定数字。这在逻辑上是错误的。假设我们的值为5,k将增加到5,这将导致第一个子句成功。这会将hexLetters[5-10]分配给binaryToHex[0],这实际上可能会导致访问冲突。然后,k将继续增加到16,这将导致else子句继续执行,覆盖我们刚刚获得的值。

如果您找到了正确的数字,请修复break,并稍微改变您的逻辑,例如:

for(k=1;k<16;k++){
    if(wholeNumber == k){
        if(k < 10)
            binaryToHex[0] = k + '0';
        else
            binaryToHex[0] = hexLetters[k-10];

        break;
    }
}

答案 1 :(得分:0)

你确定你的逻辑是对的吗?我尝试用10的输入跟随它但无济于事。我认为这个代码有很多问题。

无论如何你的问题

这句话:binaryToHex [1] =余数;

或此声明:binaryToHex [0] = wholeNumber;

将一个int赋给binaryToHex [0];

所以用printf打印时(“%c”,binaryToHex [1]);

您可以将printf更改为printf(“%i”,binaryToHex [1]),这将打印出该数字。然而,基于我在你的代码上看到的,binaryToHex [1]和[0]就此问题可以分配一个数字或一个char,所以如果它分配一个char但是你使用%i那么你会遇到同样的问题。您可以通过将其添加为binaryToHex [1] = remainder +'0',将整数0的asci数添加到语句中。因此,如果binaryToHex [1]的值为7,您将打印一个不可打印的ascii字符,但是通过向其添加“0”或48,您将打印55的ascii表示,即7,就像您想要的那样。但我认为你应该考虑重写你的代码,以避免这些黑客攻击。

无论如何,我认为你应该从你的代码逻辑开始,因为我认为它有缺陷,但我可能是错的,因为我没有编译器来测试它。