再帰処理で、改行が2つ入ってしまいます。
配列alphabetには、'z'の後ろに'\0'が入っています。
なので、再帰処理で、'z'の後ろの'\0'がprintAlphabet関数の引数で渡された際に、
\nを1つターミナルに表示して、1行分だけ改行したいです。
しかしながら、今、\nが2つ表示されて、2行分改行されてしまっています。
('0'が引数として渡される回のprintAlphabet関数では、return文が実行され、呼び出し元に戻り、
その呼び出し元では、引数は、'z'になっているはずだと認識していたのですが、
実際には、'0'になっています。)
どうしてこうなっているのかが理解できません。
ご教授いただけませんでしょうか。
C
1#include <stdio.h> 2 3void printAlphabet(char *alphabet); 4 5static char alphabet[] = "abcdefghijklmnopqrstuvwxyz"; 6 7int main(void) 8{ 9 printAlphabet(alphabet); 10 return 0; 11} 12 13void printAlphabet(char *alphabet) 14{ 15 if(*alphabet != '\0'){ 16 printf("%c", *alphabet); 17 printAlphabet(++alphabet); 18 } 19 if(*alphabet == '\0'){ // アルファベットの終端だったら、 20 printf("\n"); // 改行を入れる 21 } 22 return; 23} 24
terminal
1ユーザー名@コンピュータ名 修正後 % ./a.out 2abcdefghijklmnopqrstuvwxyz 3 4
terminal
1Thread 2 hit Breakpoint 1, main () at 問題6.c:9 29 printAlphabet(alphabet); 3(gdb) break 19 4Breakpoint 2 at 0x100003efb: file 問題6.c, line 19. 5(gdb) next 6 7Thread 2 hit Breakpoint 2, printAlphabet (alphabet=0x10000805a <alphabet+26> "") at 問題6.c:19 819 if(*alphabet == '\0'){ 9(gdb) print alphabet 10$1 = 0x10000805a <alphabet+26> "" // // **ここは想定通り。(zの後ろの\0)** 11(gdb) print *alphabet 12$2 = 0 '\000' 13(gdb) next 1420 printf("\n"); 15(gdb) next 16abcdefghijklmnopqrstuvwxyz 1722 return; 18(gdb) next 19 20Thread 2 hit Breakpoint 2, printAlphabet (alphabet=0x10000805a <alphabet+26> "") at 問題6.c:19 2119 if(*alphabet == '\0'){ 22(gdb) next 2320 printf("\n"); 24(gdb) print alphabet 25$3 = 0x10000805a <alphabet+26> "" // **ここが想定と違う。(本当は'z'が来て欲しい!)** 26(gdb) next 27 2822 return; 29(gdb) next 30 31Thread 2 hit Breakpoint 2, printAlphabet (alphabet=0x100008059 <alphabet+25> "z") at 問題6.c:19 3219 if(*alphabet == '\0'){ 33(gdb) print alphabet 34$4 = 0x100008059 <alphabet+25> "z" // **ここで'z'が来ている。** 35(gdb) 36
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/13 09:02
2021/01/13 09:33 編集
2021/01/13 11:13
2021/01/14 00:08