実現したいことと前提
配列を使い、文字列の一番最後の文字を取り扱いたいです。
具体的には、文字列(標準入力で受け付ける)w1とw2の、両方の末尾の文字を取得したいです。
文字列の長さは最大10文字で、何文字入力されるかは不明とします。
###自分で考えてみた
C
1#include <stdio.h> 2int main(void){ 3 char w[10]; 4 int i,matubi[2]; 5//w1に関して 6for(i=0;w[i]!='\0'&&i<10;i++){ 7 scanf("%c",&w[i]); 8} 9i=i-2; 10matubi[0]=w[i]; 11//w2に関して 12for(i=0;w[i]!='\0'&&i<10;i++){ 13 scanf("%c",&w[i]); 14} 15i=i-2; 16matubi[1]=w[i]; 17//出力 18printf("w1の末尾は%cで、w2の末尾は%cです",matubi[0],matubi[1]); 19}
汎用性のないコードで申し訳ないです。
forの継続条件についてですが、単にi<10としただけでは、入力された文字列が10文字未満だった場合、
ループが10回まわることで、値が入っていないorおかしな数値の入っている(ここら辺の理解が不十分です)w1[9]やw2[9]の文字が取られてしまい、最終的に、末尾文字が出力されないor「?」が出力されると思い、継続条件に**w[i]!='\0'**を追加しました。
このように書けば、たとえば、配列変数w1[]に格納されている文字列がkakiであった場合、4文字目のiの次の配列要素は空文字(つまり'\0')であり(自信がないですが)、kakiはそれぞれ1つずつ順番に配列変数w[0]~w[3]に格納されているので、このループの最終回は、初めて空文字が配列に格納されるとき、すなわち、変数iが4の時となる。
そしてループが終了されるとi++により、さらにiが1足され、i=5となる。なので、ループを抜けたあとにiから2を引いてやる。
そうすることで、空文字の前の文字、つまり、その文字列の末尾文字が取得出来る、と考えたのですが…
###期待と実行結果
実際にこのコードを実行してみました。
標準入力にて
w1を__abcdefghij__(10文字)
w2を__aiueokaki__(8文字)
としたのですが、
その結果は
w1の末尾はeで、w2の末尾は です
というものでした。
この結果は不可解です。
自分の考え方に間違いがあるものだと思いますが、どこが間違っているかがわかりません。
どなたかご教示ください。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/09 00:52
2018/09/09 01:08 編集
2018/09/09 01:13
2018/09/09 04:56
2018/09/09 05:09
2018/09/09 05:22
2018/09/09 05:26
2018/09/09 05:30
2018/09/09 05:34
2018/09/09 05:36
2018/09/09 06:14
2018/09/09 07:07
2018/09/09 07:09 編集
2018/09/09 10:38
2018/09/09 11:07
2018/09/14 05:10
2018/09/14 05:27
2018/09/14 05:32
2018/09/14 05:54
2018/09/14 06:27