1. ホーム
  2. c

[解決済み] 16進数の文字列とは何ですか?

2022-03-02 14:25:29

質問内容

質問の答えが出たので、ここで皆さんから頂いた助けを元に解決策を投稿します(Thanks!)

また、A-F/a-fを10進数に変換するもっとエレガントな方法があるはずです。たぶん、私が自分で書いたヘルパー関数(powとprintf以外の関数にはまだアクセスできません)を使うでしょう

K&R The C Programming Language, Exercise 2.3 をやっています。

を変換する関数htoi(s)を書きなさい。 16進数の文字列 (オプションの 0x または 0X を含む) を同等の整数値に変換する。 許容される桁数は0から9、aからf、AからFである "

#include <stdio.h>
#include <math.h>

#define MAXLEN 1000                                /* maximum accepted user input is 999 digits */

int htoi( char s[], int maxPower ) ;               /* maxPower will be two less than string length (len - 2) because the exponentiation is 0-indexed                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
                                                   *  remove the length values which represent '\n' and '\0' in user input                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
                                                   *  if the string begins with "0x" or "0X", we remove two more from the power variable inside the htoi() body. */

int main( void )
{
  int c, i ;
  int len ;                                        /* tracks length of hexString, used to determine exponent value */
  char hexString[ MAXLEN ] ;

  len = 0 ;
  for ( i = 0 ; i < MAXLEN - 1 && ( c = getchar() ) != EOF ; ++i ) {
    hexString[i] = c ;
    ++len ;
  }
  hexString[len] = '\0' ;                          /* value of len is one more than termination value of i in above loop */

  printf( "Hex String: %s\nInt: %d\n", hexString, htoi( hexString, len - 2 ) ) ;
  return 0 ;
}

int htoi( char s[], int power )
{
  int j, i, n, decimal ;

  n = 0 ;
  if ( s[0] == '0' && ( s[1] == 'x' || s[1] == 'X' ) ) {  /* cutting off first two array values if string begins with 0x or 0X */
      j = 0 ;
      while ( ( s[j] = s[j + 2] ) != '\0' ) {
        ++j ;
      }
      power = power - 2 ;                                 /* maximum exponent value now represents the usable data */
    }

    for ( i = 0 ; s[i] != '\n' && s[i] != '\0' ; ++i ) {
      if ( s[i] >= '0' && s[i] <= '9' ) {
        decimal = s[i] - '0' ;
        n = ( decimal * pow( 16, power ) ) + n ;
        --power ;
      } else if ( s[i] == 'A' || s[i] == 'a' ) {
        decimal = 10 ;
        n = ( decimal * pow( 16, power ) ) + n ;
        --power ;
      } else if ( s[i] == 'B' || s[i] == 'b' ) {
        decimal = 11 ;
        n = ( decimal * pow( 16, power ) ) + n ;
        --power ;
      } else if ( s[i] == 'C' || s[i] == 'c' ) {
        decimal = 12 ;
        n = ( decimal * pow( 16, power ) ) + n ;
        --power ;
      } else if ( s[i] == 'D' || s[i] == 'd' ) {
        decimal = 13 ;
        n = ( decimal * pow( 16, power ) ) + n ;
        --power ;
      } else if ( s[i] == 'E' || s[i] == 'e' ) {
        decimal = 14 ;
        n = ( decimal * pow( 16, power ) ) + n ;
        --power ;
      } else if ( s[i] == 'F' || s[i] == 'f' ) {
        decimal = 15 ;
        n = ( decimal * pow( 16, power ) ) + n ;
        --power ;
      } else {
        printf( "ERROR 69:\nInput string was not hexidecimal (0-9, A-F, a-f)\nResult is 0!\n" ) ;
        n = 0;
        return n;
      }
    }
    return n ;
}

解決方法は?

のような文字列を意味します。 AB0C5342F . C言語で言うと

char s[] = "AB0C5342F";