文字列からint型数値への変換(C言語)

このQ&Aのポイント
  • C言語において、文字列からint型の数値に変換する方法について質問です。
  • get methodで入力された文字列を16進数に変換し、それを10進数に変換する方法を教えてください。
  • 前回の回答とは異なる方法での文字列からint型への変換方法を知りたいです。
回答を見る
  • ベストアンサー

文字列からint型数値への変換(C言語)

2度目の質問になります。 現在おみくじプログラムを製作する上で、get methodによって入力フォームに入力された氏名:田中太郎が変換されたデータ「%C5%C4%C3%E6%C2%C0%CF%BA」のようなデータがnに。ラジオボタンにより男と選択された性別「man」という文字列がsに入っています。 これをint型の数値に変換したいのですが、どうやるのが一番適切な方法でしょうか? 先生には一度16進数にしてからそれをまた10進数へ~のように言われています。 ただ調べてもいい関数などが見つかりません。 まったく無知で申し訳ないのですが、よろしければご教授願います。 よろしくお願いします。 (前回質問した時に回答いただいた方法ではなく上記のような方法でやるように言われたため、以上のようなやり方をしています。前回ご回答いただいた方申し訳ないです・・・。)

  • CGI
  • 回答数5
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
noname#137556
noname#137556
回答No.5

> デコードでしないで文字コードの方だけで処理する場合 そもそも文字列の各要素には文字コードが入っていますので, 各要素の値を単純に足していくだけです。 char name[] = "%C5%C4%C3%E6%C2%C0%CF%BA"; const char *p; int s = 0; for (p=name ; *p ; p++) { s += (unsigned char)*p; } printf("%d\n", s);

Euphor1c
質問者

お礼

いつもご回答ありがとうございます! 先生と話したところデコードしなくてもよいという話になったので、文字コードだけで処理を行うことにしました。 また、その際sheep555さんのプログラムを使わせていただきました。 また、おかげさまでおみくじのプログラムを完成させることができました。 本当にsheep555さんにはお世話になりました。 本当にありがとうございました。 1月29日に千葉県の某大学で情報系ゼミでの合同発表会があり、そこで今回のWebおみくじの製作についての発表を行う予定ですので見に来てもらいたいぐらいですww 本当に感謝しています。ありがとうございました!

その他の回答 (4)

noname#137556
noname#137556
回答No.4

「%C5%C4%C3%E6%C2%C0%CF%BA」 この文字列の文字コードをそのまま足していくのが簡単ですが, 先生の言葉からしてデコードしないといけないのでしょうねぇ。 文字列の頭から1文字ずつ調べて,  '%' が現れたら次の2文字を16進数とみなして変換,-(1)  '+' が現れたら スペース ' ' に変換,  それ以外はそのまま。 とすればデコードできます。 (1) のところは,標準関数だと sscanf のフォーマットに "%02x" を指定すれば OK。 http://www.tohoho-web.com/wwwcgi3.htm#CgiEncode # 実用的な CGI だと文字コードの違いとかも気にしないといけません。

Euphor1c
質問者

お礼

いつも詳しいご回答ありがとうございます。 今日はあまり時間がないのでまだデコードの方は試していないのですが、デコードでしないで文字コードの方だけで処理する場合どのようにやればよいのでしょうか?

  • viqin
  • ベストアンサー率60% (3/5)
回答No.3

整数値の文字列を整数型( int型 )に型変換するには、atoi()を使います。 要するに、char型文字列の、"12345"を、int型の12345に変換出来るというわけです。 atoi 書式 int atoi( const char *s ) 機能 数字から整数型( int型 )に変換 引数 const char *s : 変換元の文字列を指定 戻り値 int型に変換された整数値 サンプルコード 数値の文字列 "12345" を整数型( int型 )に変換して表示してみます。 #include <stdio.h> #include <stdlib.h> int main(void) { char *s = "12345"; int i; i = atoi( s ); printf( "数値:%d¥n", i ); return 0; } 結果 数値:12345 と、表示されます。 アッサリ行けますね。

Euphor1c
質問者

お礼

またまたありがとうございますw

  • viqin
  • ベストアンサー率60% (3/5)
回答No.2

整数値の文字列を整数型( int型 )に型変換するには、atoi()を使います。 要するに、char型文字列の、"12345"を、int型の12345に変換出来るというわけです。 atoi 書式 int atoi( const char *s ) 機能 数字から整数型( int型 )に変換 引数 const char *s : 変換元の文字列を指定 戻り値 int型に変換された整数値 サンプルコード 数値の文字列 "12345" を整数型( int型 )に変換して表示してみます。 #include <stdio.h> #include <stdlib.h> int main(void) { char *s = "12345"; int i; i = atoi( s ); printf( "数値:%d¥n", i ); return 0; } 結果 数値:12345 と、表示されます。 アッサリ行けますね。

Euphor1c
質問者

お礼

ありがとうございます。 助かります。

noname#137556
noname#137556
回答No.1

「田中太郎」を数値に変換するといくつになりますか? 前回も指摘しましたが,文字列(特に氏名)をどのように数値に変換したいのかを明確にしてください。 文字数?画数の和?文字コードの和?

Euphor1c
質問者

お礼

前回に引き続き素早いご回答本当にありがとうございます! 申し訳ないです。 できるのであれば文字コードの和がいいと考えています。

関連するQ&A

  • ■int型の数値から数字文字への変換について

    はじめまして。専門学生のhide1978と申します。 今回、以下のような問題に取り組んでいるのですが、どうしても正しい結果が得られません。どなたか知恵を授けてやってください。よろしくお願いいたします。 ■問題 int型の数値(-32767から32767)を入力して、そのまま10進文字列(char型)として変換する。 ■私が書いたプログラム #include <stdio.h> int NUMtoCHAR(int c){ if(c >= 0 && c <= 9) return (c+'0'); else return c; } void main(void){ signed int i_value; int count, i; double f_value; char c[9]; printf("入力データ:");scanf("%d",&i_value); printf("\n"); for(i = 0; i < 9; i++) c[i] = ' '; if(i_value > 0){ c[0] = '+'; }else if(i_value < 0){ c[0] = '-'; } f_value = (double)i_value; count = 0; while(f_value >= 1){ f_value = f_value / 10.0; count++; } if(count == 0){ c[2] = '0'; }else{ for(i = 2; count > 0 && i < 9; count--, i++){ f_value = f_value * 10.0; i_value = f_value; c[i] = NUMtoCHAR(i_value); f_value = f_value - i_value; } } printf("10進文字 = "); for(i = 0; i < 9; i++) printf("%c", c[i]); printf("\n"); } 上記プログラムを実行して、入力データとして[32767]を入力すると、結果が[32766]となってしまいます。同じように[34]を入力すると[33]という結果になります。 elseの中に入れ子になっているfor文が怪しいということまでは判るのですが、どのように修正してよいか判りません。 大変長い質問で恐縮ですが、よろしくお願いいたします。 ■環境 OS:WindowsXP Compiler:Borland C++ 5.5.1 fowWin32

  • VC++で文字列を数値に変換する方法

    VC++にて、button1をクリックしたら、textBox1に入力された数字の文字列(10進数)を数値に変換して、x等の変数に16進数で格納したく。 下の { } の部分にどのように書けばいいのでしょうか?  初心者につき、できるだけ噛み砕いて、説明を加えて、回答お願いします。 また、textBox1に数字以外が入力されたら、エラー検出が可能であれば、その方法も教えて下さい。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { }

  • 文字列を大文字の2桁ごとのコンマ付き16進数に変換する方法

    文字列を大文字の2桁ごとのコンマ付き16進数に変換する方法がわかりません。ただ単に文字列を16進数に変更するだけならbin2hex()でできますけど、誰か知っている方はいませんか?具体的には、変換された文字列が1a2b3c4d5e6fなら、1A.2B.3C.4D.5E.6Fと変換したいんです。どうすればいいですか?

    • ベストアンサー
    • PHP
  • C言語 プログラミング 文字列

    C言語のプログラミングについての質問です。 文字列を入力して、それを逆順に表示するというプログラムを作っているのですが、 どうしても上手くいきません。 どこか間違えているのかわかりません。 わかる方いらっしゃいましたらご回答お願いします。 #include <stdio.h> int main(void) { char data[100]; int i, leng; char c; leng = 0; c =getchar(); while((c != '\n') && (c != EOF)) { data[leng] = c; leng = leng + 1; c = getchar(); } printf("%c", data[c]); return 0; }

  • C言語の文字列について

    abcdefghという文字列を入力した時に以下のように表示させたいのですがわかりません。(入力した文字を逆から表示させて、且つ文字数を4分割させて改行させる) hg fe dc ba 自分で考えたソースは以下のようです。(これではhgfedcbaと表示するだけなのです)どうしてもわからないので教えてください。宜しくお願いします。 #include <stdio.h> #include <string.h> int main(void) { char input[20]; size_t len,h,k,j; size_t i; gets( input); len=strlen(input); h=len/5; k=h; for(j=1; j<=5;++j) { for(h=k*(j-1); h<k*j; ++h) { printf( "%c", input[len - h - 1]); } } scanf( "%20s", input); return 0; }

  • C言語とCGIによるおみくじの製作

    初投稿になります。 私は現在C言語とCGIを使ったWebおみくじを作っています。 内容としては、入力フォームに入力された氏名、生年月日、性別の文字列を受け取り、それを整数に変換します。 そして変換された整数を計算することで20種類ほどの結果を返したいと考えています。 しかし、C言語によるCGIはperlなどのように資料が多くないため、あまり似たような構成のプログラムがなくあまり理解できていません。 Googleなどでc cgi などで検索して、見ることができるものは全て見ましたが、やはり理解できていない現状です。 特に、フォームに入力されたデータをcgiプログラムでどう受けるのか、また受け取った文字列をどうやって整数に変換するのかが分かりません。 もし、わかる方がいましたら、よろしければご教授願います。 また、コンパイルはgccで行っています。

    • ベストアンサー
    • CGI
  • 離散フーリエ変換をC言語でどの様に書けばいいですか?

    C言語でDFT離散フーリエ変換を書くにはどの様に書けばよろしいですか? Googleで検索すれば書き方は出てくるのですが、使ってる関数がいまいちよく分かりません。 ・データの入力 ↓ ・フーリエ変換の計算 ↓ ・結果の出力というのをやればいいのは理解できるのですが、C言語でどの様に書けばいいか分からなくて…

  • C言語で2桁Hex文字列を10進数値に変換する方法

    C初心者です。よろしくお願いします。 測定器からシリアルで送られてくる2桁のHexデータ(リトルエンディアン)を10進数値に変換したいのですが、ネットでいろいろ調べてもよく解りません。 ネット上にあったプログラムを参考にして、次のようにやっています。 char d[3]; //受信データ // データ受信処理後 int i=0, c=0, n; while(d[i] != '\0'){ n = n * 0x10; c = d[i++]; if((c >= '0') && (c <= '9')){ n += c - '0'; } else if((c >= 'A') && (c <= 'F')){ n += c - 'A' + 10; } } printf("%d\n",n); 結果を表示すると’0’になってしまいます。 どこがダメなのか、よろしくお願いします。

  • 数値・文字列を決まった範囲の数値に変換・割り当てる(ハッシュする?)方

    数値・文字列を決まった範囲の数値に変換・割り当てる(ハッシュする?)方法について ハッシュ関数を使えば、ある文字列・数値を何らかの法則で暗号のように変換できることは分かったのですが、その変換される結果の範囲を決まった数値として指定することは可能なのでしょうか。 例えば『文字列を「1~95」の数値のどれかに割り当てたい』という感じです。 ランダムでなく、何度やっても同じ結果にしたいのです。 また、範囲は例では「1~95」としていますが、「1~230」「1~500」など自由に変更したいと思っています。 ※以前質問した占いに関連するものでして、結果の数が定まっていないため、 結果の数に応じて、元となるデータから占い結果に割り当てるということをやりたいと思っています。 ご教示いただけますようお願いします。

    • ベストアンサー
    • PHP
  • C言語

    C言語 10進数n(0<n<256)を2進に変換させろ 配列を使うな do-whileでnを入力させることはできましたが、そこから先がわかりません。 for文を使えと言われたのですが……

専門家に質問してみよう