簡體   English   中英

如何在 C 中進行十進制到十六進制的轉換器

[英]How to make a decimal to hexadecimal converter in C

所以我是 C 的絕對初學者,我必須做一個十進制到十六進制的轉換器。

所以我想我需要做一個循環,直到結果為 0。

但是我如何讓它記住所有的剩余部分? 該數字將使用 scanf 輸入,因此我無法為其定制代碼。

現在我想做這樣的事情

while(number(n)!=0)
{
    number0 / 16 = number1
    number0 % 16 = remainder0
    number1 / 16 = number2
    number1 % 16 = remainder1
    .....
    number(n-1) / 16 = 0
    number(n-1) % 16 = lastremainder
}

hex = lastremainder, ..., remainder2, remainder1, remainder0

但是我怎樣才能讓程序在循環期間創建變量呢? 我必須使用完全不同的方法嗎? 我看了其他十進制到十六進制的轉換器,但我不太明白它們是如何工作的。

就像我說的那樣,我是一個絕對的初學者,如果這個問題很愚蠢,我很抱歉。

感謝您的答復。 那么 arrays 是我問題的答案嗎? 我現在還不完全理解它們,但感謝您指出正確的方向。

老實說,我只是使用sprintf

char hex[10];
sprintf(&hex, "%x", INT_MAX);//INT_MAX macro requires limits.h, though...
printf("%s\n", hex);//prints 7fffffff

任務完成...
總的來說,您的代碼可能類似於:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char hex[10];
    int input;
    scanf("%d", &input);
    sprintf(&hex, "%x", input);
    printf("The number %d, turned to hexadecimal is: %s\n", input, hex);
    return 0;
}

甚至:

    int input;
    scanf("%d", &input);
    printf("The number %d, turned to hexadecimal is: %x\n", input, input);

創建一個數組,然后將其寫入其中:

int array[50];
int counter=0;

[...]

while(number!=0)
{
   [...]

   array[counter]=number%16;
   number/=16;
   ++counter;
}

array[counter]=number%16; 表示數組中的第一個元素將為number%16-第二個元素將為(number / 16)%16等。

您需要counter來知道數組中有多少個元素(剩余多少個元素),以便以后可以將它們向后寫入。

(在這里要考慮到您有一個限制int array[50];因為,如果您的人數真的很大並且您的剩余人數超過50,會發生什么?解決方案是動態地編寫此代碼,但是我不認為您現在應該為此擔心。)

如果你想要一個過於復雜的版本。 這里是 go。 從命令行運行東西:

./toHex 255 2

-> output 將是 -> ff

#include<stdlib.h>
#include<stdio.h>
#include<string.h>


char letterMap(float num){

  char output;
  
  switch((int) num){
  case 0:
    output = '0';
    break;
  case 1:
    output = '1';
    break;
  case 2:
    output = '2';
    break;
  case 3:
    output = '3';
    break;
  case 4:
    output = '4';
    break;
  case 5:
    output = '5';
    break;
  case 6:
    output = '6';
    break;
  case 7:
    output = '7';
    break;
  case 8:
    output = '8';
    break;
  case 9:
    output = '9';
    break;
  case 10:
    output = 'a';
    break;
  case 11:
    output = 'b';
    break;
  case 12:
    output = 'c';
    break;
  case 13:
    output = 'd';
    break;
  case 14:
    output = 'e';
    break;
  case 15:
    output = 'f';
    break; 
  }
  return output; 
}


int main(int argc, char* argv[]){


  if(argc  < 2){
    printf("Needs two arguments: number , bytes to allocate");
    return 1; 
  }

  float num = atof(argv[1]);
  float quotient = 10.0 ; 
  int bytes = atoi(argv[2]);
  printf("Starting bits: %d\n", bytes);
  printf("Num: %f\n", num); 
  char output[bytes];
  output[bytes - 1] = '\0'; 
  int index = bytes;
  
  while((num > 0) && (index >= 0)){
    printf("num: %f\n", num);
    printf("index: %d\n\n", index); 
    quotient =((int) num) % 16;
    char next = letterMap(quotient);
    printf("Next: %c\n", next); 
    output[index] = next; 

    num -= quotient;
    num /= 16;
    index--; 
  }
  char *ptr = &output[0];

  printf("Hexadecimal: %s\n",ptr ); ``
  return 0; 
}

如果您希望能夠獲得大小不受限制的數字,則需要使用動態數組。 首先,通過循環獲取輸入長度,然后根據需要分配數組。 您需要在循環中增加索引並將當前值放入array [index]。

嘗試一下:

    char hex = [], finalHex = [];
while(num != 0) {
num = num/16;
rem = num%16;
switch(rem) {
case 0 : 
hex = '0';
break;
case 1 : 
hex = '1';
break;
case 2 : 
hex = '2';
break;
case 3 : 
hex = '3';
break;
case 4 : 
hex = '4';
break;
case 5 : 
hex = '5';
break;
case 6 : 
hex = '6';
break;
case 7 : 
hex = '7';
break;
case 8 : 
hex = '8';
break;
case 9 : 
hex = '9';
break;
case 10 : 
hex = 'A';
break;
case 11 : 
hex = 'B';
break;
case 12 : 
hex = 'C';
break;
case 13 : 
hex = 'D';
break;
case 14 : 
hex = 'E';
break;
case 15 : 
hex = 'F';
break;
}
strcat(hex, finalHex);
finalHex = hex;
}
 printf("%s", finalHex);
// decimal to hex converter
char* dec2hex(int num){
  int rem = 0,i=0;
  char hex[3];
  while(num > 0 && i >=0){
    rem = num%16;
    hex[i] = rem<10 ? (char)rem+48 : (char)rem+55;
    num/=16;
    i++;
  }
  hex[i]='\0';
  return strrev(hex);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM