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

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

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

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

Q&A

解決済

2回答

976閲覧

0 ~ 9 の数字が 4 つ並んだ文字列 S を一つずつ分割して足し算したい。

whitehorse85921

総合スコア34

C

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

0グッド

0クリップ

投稿2021/05/03 10:04

編集2021/05/03 10:08

前提・実現したいこと

0 ~ 9 の数字が 4 つ並んだ文字列 S を一つずつ分解して、1番目と4番目の文字を数値に変えて足し算し、2番目と3番目の文字を数値に変えて足し算したいです。

発生している問題・エラーメッセージ

エラーメッセージはないのですが期待する出力とは違った出力になってしまいます。 例)入力例が「2134」だったら   正しい出力)64   私の間違った出力)102100

該当のソースコード

C

1 2#include <stdio.h> 3#include <string.h> 4#include <stdlib.h> 5 6int main(void) 7{ 8 char s[100]; 9 scanf("%s", s); 10 11 int n1, n2 ,n3, n4; 12 n1 = s[0]; 13 n2 = s[1]; 14 n3 = s[2]; 15 n4 = s[3]; 16 17 printf("%d%d", n1 + n4, n2 + n3); 18 19 return 0; 20 21}

試したこと

atoi関数を使ったり、strtokを使ったりしたのですが、atoi関数は「n1 = atoi(s[0]);」としてエラーが出たので「n1 = atoi(&s[0]);」に直したら全く違う結果が出てしまい、strtok関数は入力文字に区切り文字がないため分割することができませんでした。

補足情報(FW/ツールのバージョンなど)

paiza.ioを使いました。
ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

一例です

c

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4 5int main(void) 6{ 7 char s[100]; 8 scanf("%s", s); 9 10 int n1, n2 ,n3, n4; 11 n1 = s[0] - '0'; 12 n2 = s[1] - '0'; 13 n3 = s[2] - '0'; 14 n4 = s[3] - '0'; 15 16 printf("%d%d", n1 + n4, n2 + n3); 17 18 return 0; 19 20}

各文字から '0' を引いていますが、文字「0」を示す数値を引いています。
「0」の文字から文字コードが連番になっているためにこのような表現が可能です


atoi の挙動についてですが、引数に文字列(char ポインタ)を受け付けます
s[0] を渡した場合は型が異なりエラーが発生します。


&s[0] を渡したときの挙動ですが、 &s[0] は s の先頭文字を示しますね。そのアドレスですから、 &s[0]s と同値になります。

ゆえに

c

1n1 = atoi(&s[0]);

と実行したとき n1 に入るのは数値「2134」です

投稿2021/05/03 10:24

coolwind0202

総合スコア708

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

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

whitehorse85921

2021/05/03 10:28

coolwind0202様、ありがとうございます。 atoiの挙動がとても分かりやすかったです。
guest

0

ベストアンサー

2134の入力に対して、
n1 = s[0];だと、n1に入るのは2じゃなくて'2'です。

2'2'の違いは分かりますでしょうか?2は数値の2ですが、'2'は 2 という文字の文字コードの値です。普通は50という数値です。

0から9までの数字(数値じゃなくて)は、連続した文字コードを持っていますので、数字の文字コードを数値に直すのは、起点である 0 の文字コードを引けば良いです。

C

1 n1 = s[0] - '0'; 2 n2 = s[1] - '0'; 3 n3 = s[2] - '0'; 4 n4 = s[3] - '0';

投稿2021/05/03 10:14

otn

総合スコア85901

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

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

otn

2021/05/03 10:18

別解としては、最初から1桁の数字として読む。 scanf("%1d%1d%1d%1d", &n1, &n2, &n3, &n4);
whitehorse85921

2021/05/03 10:19

otn様、ありがとうございます。 調べてもわからなかったので助かりました。
otn

2021/05/03 10:38

さらに別解としては、 int n; scanf("%d"); で、2134 という数値を得て、 n1 = n / 1000; n2 = n / 100 % 10; n3 = n / 10 % 10; n4 = n % 10; と数学的に求めるか。これもわりと使いますね。
whitehorse85921

2021/05/03 12:07

otn様、いろいろな方法を教えてくださり、ありがとうございます。 勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問