2013-02-16 60 views
0
#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或它什么都没有。请帮助如何在C

+0

我建议使用一个调试器逐行扫描一行代码,以检查其行为是否符合您的期望。调试自己的代码对于任何程序员来说都是非常关键的技能。 – 2013-02-16 01:14:58

回答

0

最大的问题可能是在这条线:

binaryToHex[1] = remainder; 

而且simiar为binaryToHex[0]声明。这应该是一个角色(当它是A-F时)。相反,在这里,你正在分配一个数字。这将导致与该号码相对应的ASCII字符被打印,对于0-9,该ASCII字符处于不可打印值(NUL-TAB)的范围内。

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

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; 
    } 
} 
0

你确定你的逻辑是正确的?我试着跟着输入10来无效。我认为这个代码有太多的错误。

反正你的问题

这一说法:binaryToHex [1] =余数;

或以下语句:binaryToHex [0] = wholeNumber;

将一个int赋给binaryToHex [0];

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

你可以改变你的printf为printf(“%i”,binaryToHex [1]),它会打印出数字。不过,根据我在代码中看到的内容,binaryToHex [1]和[0]可以分配一个数字或一个字符,所以如果它分配了一个字符但是使用%i,那么您将遇到同样的问题。您可以通过将整数0的asci数字添加到语句中,例如binaryToHex [1] = remainder +'0'。所以如果binaryToHex [1]的值是7,那么你将会打印一个不可打印的ascii字符,但是通过加上'0'或者48来打印ascii表达式55,它就是7,就像你想要的那样。但我认为你应该考虑重写你的代码,以避免这些黑客入侵。

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

+0

我同意有更多可能的错误,我从来没有学过C,我的老师已经指派每个人去做一个项目。这就是为什么我需要尽可能多的帮助。感谢您的回应 – user2077406 2013-02-17 20:09:36