こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語でcharの足し算

char型の配列の中から数を取り出して足し算させたいです。
この配列には数字だけではなく英数字のどちらかが入るので、intではなくchar型の配列を作りました。

scanf("%c", &i);
と、scan文をループさせてchar i[3]の中身を{1,1,a}と入れたとします。
このとき、i[0]+i[1]とやると、中の文字コード(?)を足してしまって98という結果が出てきてしまいます。
かといって、
scan("%d", &i);とやると、数字を入れているときはいいのですが英字を入れると「フ」という文字になってしまいます。

上手い具合に数字はコードじゃなく数字として、英字は英字のまま1つの配列の中に入れられないものでしょうか。
宜しくお願いします。

投稿日時 - 2008-06-14 05:07:49

QNo.4099173

すぐに回答ほしいです

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

こんなことがしたいのでしょうか。
#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関数です。文と関数とを正確に区別しましょう。

投稿日時 - 2008-06-14 06:34:24

お礼

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

投稿日時 - 2008-06-14 12:02:26

このQ&Aは役に立ちましたか?

20人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

>#3さん
> void main()
main関数の型は、C言語の規格でintと決まっています。

>  char cStr[32] = "0a1b2c3d4e5f6789\0";
最後の\0は、なくてもよいですね。あってもいいですけれど。

>  if( ( *p9 > '0' ) && ( *p9 <= '9' ) ) *p9 &= 0x0F; // ◆
0x0FとのANDをとるよりは、'0'を引く方が直感的にわかりやすそうな気がします。

投稿日時 - 2008-06-14 10:30:43

ANo.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" );
}
注:インデントに全角空白を用いています。タブに一括変換して下さい。

投稿日時 - 2008-06-14 08:24:25

お礼

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

投稿日時 - 2008-06-14 12:05:28

ANo.1

DN7

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

投稿日時 - 2008-06-14 05:21:31

お礼

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

投稿日時 - 2008-06-14 12:00:43

あなたにオススメの質問