[解決済み] 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";
関連
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み】ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生した
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み】fgetsによるセグメンテーションフォールト(コアダンプ) - と思う。
-
[解決済み】execvp: バッドアドレスエラー
-
[解決済み】配列型char[]が代入できない [重複]。