Штудирую K&R. Пытаюсь разобраться со строками в С. Но они сводят меня с ума.
Как я понимаю, строка в С это массив символов, заканчивающийся на '\0'. Т.е., например, английский алфавит состоит из 26 букв. Значит в массиве его индексы будут от 0 до 25. Ну и еще на символ '\0'. Значит, чтобы содержать английский алфавит нужно создать массив длиной 27 элементов.
char s1[26] = "abcdefghijklmnopqrstuvwxyz";
Логика проста, как кажется: сколько букв, такое же и число в квадратных скобках. А если нужно хранить только две буквы, например, 'r' и 's', то, по аналогии, пишем в скобках 2:
char s2[2] = "rs";
Но если попытаться распечатать по очереди элементы этих массивов, то ведут они себя по разному:
#include <stdio.h>
int main()
{
char s1[26] = "abcdefghijklmnopqrstuvwxyz";
char s2[2] = "rs";
int i;
for (i = 0; s1[i] != '\0'; i++)
printf("%d\t%c\n", i, s1[i]);
putchar('\v'); // визуально отделим одно от другого
for (i = 0; s2[i] != '\0'; i++)
printf("%d\t%c\n", i, s2[i]);
return 0;
}
Если у первой строки с алфавитом вывод, вроде бы, какой и должен быть (печатаются элементы с 0 по 25), то у второго массива что-то странное.
0 a
1 b
2 c
3 d
4 e
5 f
6 g
7 h
8 i
9 j
10 k
11 l
12 m
13 n
14 o
15 p
16 q
17 r
18 s
19 t
20 u
21 v
22 w
23 x
24 y
25 z
0 r
1 s
2 a
3 b
4 c
5 d
6 e
7 f
8 g
9 h
10 i
11 j
12 k
13 l
14 m
15 n
16 o
17 p
18 q
19 r
20 s
21 t
22 u
23 v
24 w
25 x
26 y
27 z
Но если второй массив создать на один элемент длиннее, то все получается нормально:
char s2[3] = "rs";
Получается, что s2[2] = '\0'. А что такое для чего нужен s2[3] ? И почему в первом случае (с полным алфавитом), сколько букв, такое и число, а тут не так?
Не пойму, где я туплю?