質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

3443閲覧

数字列を数値に変換したい

study5563

総合スコア9

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/04/22 23:59

編集2020/04/23 00:11

前提・実現したいこと

以下のプログラムコードで行いたいのが、

・10文字以内の数字列を入力
・数字列の1つ1つの数字をそれぞれ1桁の数値に変換しその合計を求める
・合計値の1の位の数を数字列の最後尾に追加して出力

例)入力数値:54321 合計:5+4+3+2+1=15(1の位の数は5) 出力:543215

というものです。配列strに入力した数字列をatoi関数で数値に変換したいのですがオーバーフローが起こってしまいます。以下の実行結果の例で言うと、2を10個足した総和が20で1の位は0なので出力結果は22222222220とさせたいのですが2222222222-8と出力されてしまいます。どこを改善すればよいのかよくわからないので教えていただきたいです。よろしくお願いいたします。

該当のソースコード

#include <stdio.h> int main() { char str[11]; //入力数字列(10文字まで) int keta; //各桁の数字 int sum = 0; //数字列の各桁の数字の総和 int ichi; //総和の1の位の数 int num; //計算用変数 printf("10文字以内の数字を入力してください => "); scanf("%s", str); printf("%s", str); num = atoi(str); while(num){ keta = num % 10; sum = sum + keta; num = num / 10; } ichi = sum % 10; printf("%d\n", ichi); return 0; }

###実行結果

10文字以内の数字を入力してください => 2222222222 2222222222-8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/04/23 00:05

オーバーフローが起こるとは具体的にどうなるんでしょう。 エラー出るならエラーメッセージを提示しましょう
kaina

2020/04/23 00:15

int型のサイズは4バイトで、最大値は2147483647、最小値は-2147483648となります。 それ以上の数字を入力したら当然オーバーフローになりますね。 変数の型はそれぞれ使用できる範囲が決まっているから当然ですね。 では、どうすればよいか考えてみては?
yuki23

2020/04/23 00:16

前の質問のSHOMIさんのコメントを読みましたか?
guest

回答3

0

配列strに入力した数字列をatoi関数で数値に変換したいのですが

全体を数値として計算するのでなく、「まるごとの入出力」と「1桁ごとの演算」しかしないのであれば、変換は不要です。1文字ずつcharを読んでいって、数字 - '0'とすればその数値に変換できます。

投稿2020/04/23 00:25

編集2020/04/23 00:49
maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

自己解決いたしました。色々アドバイスくださった方々ありがとうございました。

#include <stdio.h> int main() { char str[11]; //入力数字列(10文字まで) int keta; //各桁の数字 int sum = 0; //数字列の各桁の数字の総和 int ichi; //総和の1の位の数 int idx; //添字 printf("10文字以内の数字を入力してください => "); scanf("%s", str); for (idx = 0; idx < strlen(str); idx++) { printf("%c", str[idx]); sum = sum + str[idx]; } ichi = sum % 10; printf("%d\n", ichi); return 0; }

投稿2020/04/23 01:12

study5563

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

2222222222

を変換すると、int ではオーバーフローするからでは?

-2072745074

long num ;にすると正常に変換することができると思います。

投稿2020/04/23 01:04

herobo

総合スコア153

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問