#include <stdio.h> int main(void) { char str[] = "0123456789"; int a, b; sscanf_s(str + 2, "%1d", &a);//3番目の数字があるアドレスを指定して、1文字だけ数値として読み取る //引数(目的)にint型のaを用意するが、sscanf_sはアドレスしか扱えないようなので //&aとした。多分、strのアドレスを+2したときのアドレスに入っている数値(2)の変数aの入っている //「アドレスに入れるためにa自体のアドレスを表す&を付けたのだろう。そのaのアドレスに数値(2)が入るように」 sscanf_s(str + 5, "%1d", &b);//6番目の数字があるアドレスを指定して、1文字だけ数値として読み取る printf("%d\n", a + b);
での char str[] = "0123456789";の文字列ですが0123456789という文字を表しているのですよね?
**char str[] =**となる文字列はすべて文字のみを表しているとかでしょうか?
そして、仮に10や35など二桁を 文字列 に入れたい場合はどう書けばいいのでしょうか?
char str[] = "'12''473''900''4'";で合っていますか?
逆にchar str[] =で文字としての値ではなく数値としての文字列を表現することはできるのでしょうか?
二問目の質問です。
以下のプログラム
#include <stdio.h> #include <stdlib.h> int main(void) { char str[] = "0123456789"; int i = 0; int num = 0; int num2 = 0; int num3 = 0; int num4 = 0; num = atoi(str); printf("int型変数numの値は: %d\n", num); i = 2; num2 = str[i] - '0'; // atoiは文字列を数値にするものであって文字を数値にするものではない i = 5; num3 = str[i] - '0'; num4 = num2 + num3; printf("int型変数num4の値は: %d\n", num4); } ```では、 char str[] = "0123456789";の文字列は下に書いたプログラムより数値ではなく、「文字」としての数字を扱ってるため関数 atoiを使って、"1"と言う文字は'1'と言う数字、数値に変えられています。 どうやって文字の数字を数値に変えているのでしょうか? 原理とプログラムが知りたいです。 三つ目の問題です。 ```ここに言語を入力 #include <stdio.h> int main(void){ char str[] = "0123456789"; int a; a = (str[2] - '0') + (str[5] - '0'); //()は無くてもいいけど... printf("int型変数aの値は: %d\n",a); char dt[] = { 0,1,2,3,4,5,6,7,8,9 }; a = dt[2] + dt[5]; printf("int型変数aの値は: %d\n",a); return 0; }
'0'は数値としての0を表すのでしょうか?
仮にそうだとして、なぜ数字の文字である char str[] = "0123456789";より
(str[2] - '0')を見た時に文字の0(0の文字コード)とstr2と引き算が出来るのでしょうか?変だと思いました。
どうやってatoiの関数を使わずに文字列の文字を数値にせずに(str[2] - '0') できたのか。。。
どうか問題が複数ありますが一つ一つに回答して頂けるとありがたいです。そして私の間違いを正してください。
編集
#include <stdio.h> int main(void) { char str[] = "0123456789"; int a, b; sscanf_s(str + 2, "%1d", &a);//3番目の数字があるアドレスを指定して、1文字だけ数値として読み取る //引数(目的)にint型のaを用意するが、sscanf_sはアドレスしか扱えないようなので //&aとした。多分、strのアドレスを+2したときのアドレスに入っている数値(2)の変数aの入っている //「アドレスに入れるためにa自体のアドレスを表す&を付けたのだろう。そのaのアドレスに数値(2)が入るように」 sscanf_s(str + 5, "%1d", &b);//6番目の数字があるアドレスを指定して、1文字だけ数値として読み取る printf("%d\n", a + b);
に関して、sscanf_s(str + 2, "%1d", &a);で指定したアドレスにある文字は2で値は50です。そして、sscanf_s(str + 5, "%1d", &b);で指定されたアドレスにある文字は5で値は53です。それなのにprintf("%d\n", a + b);での実行結果は7となりました。なぜ103ではないのでしょうか?関数sscanf_sには関数atoiのような文字2などを値2にするような作用などあるのでしょうか?
編集1
#include <stdio.h> int main(void) { char str[] = "0123456789"; printf("%d\n", str[2] + str[4]); }
なぜ、配列の書き方が char str[] = "0123456789" の場合は
str[2] + str[4]の足し算が50+52で102と10進数で出るのでしょうか?
てっきり答えは6と思っていました。
char str[] = "0123456789";と書いて、かつ配列ので文字列の数字を扱う場合はそうなるルールなのでしょうか?
#include <stdio.h> int main(void) { char str[] = { 1,2,3,4,5 }; printf("%d\n", str[1] + str[3]); }
の char str[] = { 1,2,3,4,5 }; とした場合は6と出ます。