0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

サンプルコード 文字列 -> 数値

Last updated at Posted at 2018-11-26

C言語でchar型の数字からint型の数字に変換したときのメモ

やっていること

1. 入力した値を文字列として保存
2. 文字列を数値に変換
3. INT型の範囲にあるかをチェック

注) int型の範囲は一般に以下のように定義されているが、環境によっては異なる場合もあるので、一応、桁数をFOR文で数えている。

int の最小値 = -2147483648
int の最大値 = 2147483647

kadai.c
# include<stdio.h>
# include<limits.h>

# define NUMBER 100 // 入力できる文字は100桁までとする(変更可)

// プロトタイプ宣言
int str2value(const char moji);

// main関数
int main(void){
	int i; // カウンタ
	int num=0; // 入力された文字列の文字数保存用
	int int_max=INT_MAX; // INT_MAXの桁数確認用
	int max_num=0; // INT_MAXの桁数保存用
	int flag=0; // 記号の有無の確認用
	int power=1; // 乗数計算用
 	long check = 0; // long型 入力された値のチェック用
	char word[NUMBER]; // 入力文字の保存用1

	// 文字列の入力
	printf("文字列を入力してください:");
	scanf("%s",word);

	// 入力された 文字数のカウント
	for(i=0;word[num]!='\0';i++)
		num++;

	// INT_MAXの 文字数のカウント
	while(int_max != 0) {
		int_max /= 10;
		max_num++;
	}

	// 一文字ずつ'char型'を'int型'にする
	int kazu[num]; // 入力文字の保存用2

	for(i=0;word[i]!='\0';i++) {
		kazu[i] = str2value(word[i]);

		// 変換された文字を確認する
		// 1桁目の処理
		if(i==0) {
			// 負の値のとき1のフラグを立てる
			if(kazu[i] == -3)
				flag = 1;
			// "+記号"のとき2のフラグを立てる
			else if(kazu[i] == -5) {
				flag = 2;
			}
			// 無効な値の場合 終了
			else if(kazu[i] <= 0 || kazu[i] > 10) {
				printf("無効な値が入力されました。終了します。\n");
				return 0;
			}
		}
		// 二桁目以降の処理
		else
			// 無効な値の場合 終了
			if(kazu[i] < 0 || kazu[i] >= 10) {
				printf("無効な値が入力されました。終了します。\n");
				return 0;
			}
	}

	// 記号なし数字の場合
	if(flag == 0) {
		// 桁数が多すぎるときは入力された文字列がINT_MAX以上とみなして終了させる
		if(max_num < num) {
			printf("INT_MAX以上の値が入力されました。終了します\n");
			return 0;
		}

		// check に入力された文字列を数値にする
		for(i=num;i>0;i--) {
			check = check + (long)kazu[i-1]*power;
			power *= 10;
		}
	}
	// 記号あり数字の場合
	else {
		// 桁数が多すぎるときは入力された文字列がINT_MAX以上とみなして終了させる
		if(max_num < num-1) {
			printf("INT_MAXまたは、INT_MINを超える値が入力されました。終了します\n");
			return 0;
		}

		// check に入力された文字列を数値にする 終了条件を(i>1)にすることで符号を無視
		for(i=num;i>1;i--) {
			check = check + (long)kazu[i-1]*power;
			power *= 10;
		}
	}

	// 負の値をチェック
	if(flag == 1) {
		// 負の値にする
		check *= -1;

		if(check < (long)INT_MIN) {
			printf("INT_MINより小さい値が入力されました。終了します\n");
			return  0;
		}
	}
	// 正の値をチェック
	else {
		if(check > (long)INT_MAX) {
			printf("INT_MAXより大きい値が入力されました。終了します\n");
			return 0;
		}
	}

	// 正しい値が入力された時
	printf("文字列を数値に変換しました。\n");
	printf("入力された値は:%ldです。\n", check);

	return 0;
}

// str2value関数 (文字列を数値に変換して返す)
int str2value(const char mozi){
	return mozi - '0';
}

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?