これはおそらくここで何百万回も尋ねられてきましたが、これは を介した単純な一般的な解決策でありint
、tolower()
(大文字または小文字のいずれかを主張することで回避できます) およびstrlen()
(きれいに回避するのは困難であり、とにかくあなたのコードで使用してください):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int st_to_int(char * st, int base);
void int_to_st(int n, char * buffer, int base);
void reverse_string(char * buffer);
int main(void) {
char input[] = "0D76";
int n = st_to_int("0D76", 16);
printf("Hex string '%s' converted to an int is %d.\n", input, n);
char buffer[100];
int_to_st(n, buffer, 10);
printf("%d converted to a decimal string is '%s'.\n", n, buffer);
int_to_st(n, buffer, 16);
printf("%d converted to a hex string is '%s'.\n", n, buffer);
return EXIT_SUCCESS;
}
int st_to_int(char * st, int base) {
static const char digits[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z'
};
int result = 0;
while ( *st ) {
result *= base;
for ( int i = 0; i < (int) sizeof(digits); ++i ) {
if ( digits[i] == tolower(*st) ) {
result += i;
break;
}
}
++st;
}
return result;
}
void int_to_st(int n, char * buffer, int base) {
static const char digits[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z'
};
int i = 0;
while ( n > 0 ) {
int next_digit = n % base;
n = n / base;
buffer[i++] = digits[next_digit];
}
buffer[i] = 0;
reverse_string(buffer);
}
void reverse_string(char * buffer) {
int buflen = strlen(buffer) + 1;
char revbuf[buflen];
int i;
for ( i = 0; i < buflen - 1; ++i ) {
revbuf[i] = buffer[buflen - 2 - i];
}
revbuf[i] = 0;
for ( i = 0; i < buflen; ++i ) {
buffer[i] = revbuf[i];
}
}
出力が得られます:
paul@local:~/src/c/scratch/strconv$ ./strconv
Hex string '0D76' converted to an int is 3446.
3446 converted to a decimal string is '3446'.
3446 converted to a hex string is 'd76'.
paul@local:~/src/c/scratch/strconv$
このコードは、バッファ オーバーフローや無効な入力 (英数字以外の入力など) をチェックしません。演習として残します。同様に、負の数や 0 は処理しません。変更するのは簡単ですが、「複雑/長い」ことは避けたいと考えていました。