[英]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.