• ベストアンサー

C言語でcharの足し算

char型の配列の中から数を取り出して足し算させたいです。 この配列には数字だけではなく英数字のどちらかが入るので、intではなくchar型の配列を作りました。 scanf("%c", &i); と、scan文をループさせてchar i[3]の中身を{1,1,a}と入れたとします。 このとき、i[0]+i[1]とやると、中の文字コード(?)を足してしまって98という結果が出てきてしまいます。 かといって、 scan("%d", &i);とやると、数字を入れているときはいいのですが英字を入れると「フ」という文字になってしまいます。 上手い具合に数字はコードじゃなく数字として、英字は英字のまま1つの配列の中に入れられないものでしょうか。 宜しくお願いします。

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.2

こんなことがしたいのでしょうか。 #1さんの回答にあったctoi関数(標準関数にはありません、念のため)を作ってみました。 #include <stdio.h> #include <ctype.h> int ctoi(char c) { return isdigit(c) ? c - '0' : c; } int main(void) { char a[3] = { '1', '1', 'a' }; printf("%d\n", a[0] + a[1]); printf("%d\n", ctoi(a[0]) + ctoi(a[1])); return 0; } ところで、 > scan文 scanf関数です。文と関数とを正確に区別しましょう。

mints001
質問者

お礼

わざわざ例まで作っていただいてありがとうございます。 お蔭様で、非常に分かりやすかったです。 本当にありがとうございました。

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.4

>#3さん > void main() main関数の型は、C言語の規格でintと決まっています。 >  char cStr[32] = "0a1b2c3d4e5f6789\0"; 最後の\0は、なくてもよいですね。あってもいいですけれど。 >  if( ( *p9 > '0' ) && ( *p9 <= '9' ) ) *p9 &= 0x0F; // ◆ 0x0FとのANDをとるよりは、'0'を引く方が直感的にわかりやすそうな気がします。

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

☆ご質問主旨2つの関わりが、いまいち、・・。 >char型の配列の中から数を取り出して足し算させたいです。  ・配列の個々の値が1~9であるもののみ、加算するだけでは・・。  ・0で文字列終了(▼)。 >数字はコードじゃなく数字として、英字は英字のまま1つの配列の中に入れられないものでしょうか。  ・直接入れるのでなく、文字として入れてから、数に変換する方法も(下にソース)。 ソースでは、  ・コードが49~57の場合のみ、数に変換(◆)しています。   なお、'0' はそのままのコード(48)で入れてます(▼文字列終了判定のため)。   http://e-words.jp/p/r-ascii.html -------------------------------------------- #include <stdio.h> void main() {  char cStr[32] = "0a1b2c3d4e5f6789\0";  char *p9, *p0;  p0 = p9 = cStr;  while( *p9 ){ // 数字コード → 数   printf( "%02X ", *p9 ); // 変更前   if( ( *p9 > '0' ) && ( *p9 <= '9' ) ) *p9 &= 0x0F; // ◆   p9++;  }  printf( "\n" );  while( *p0 ){   printf( "%02X ", *p0 ); // 変更後   p0++;  }  printf( "\n" ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。

mints001
質問者

お礼

すみません、分かりにくい質問ですよね。 僕も質問しながら「伝わりにくそうな質問文だなぁ・・・。」とは思ったのですが、みなさんに主旨を汲み取っていただけたようでほっとしております。 文字として入力して、後から変換をかける方法もあるんですね。 参考になります。ありがとうございました。

  • DN7
  • ベストアンサー率30% (23/76)
回答No.1

ctoi関数とかで数値に変換してから計算すればよいのでは?

mints001
質問者

お礼

すごい! こんな関数あったんですね。 #include <stdio.h>しか使った事がなかったので、勉強になりました。 ありがとうございます。