Различие массива и строки в си

Я начинающий, не ругайтесь сильно :) Я не понимаю причину, по которой вывод массива типа char с помощью %s не равен выводу по элементу.

#include<stdio.h>
int main() {
    char a = '1';
    char b = '2';
    char c[2];
    for (int i = 0; i < 2; i++){
        if (i == 0)
            c[i] = a;
        else 
            c[i] = b;
    }
    printf("%s\n",c);
    for (int i = 0; i < 2; i++) {
        printf("%c", c[i]);
    }
    return 0;
}

Ответы (1 шт):

Автор решения: KoVadim

все очень просто. Достаточно спросить себя, "как printf узнает длину строки?" а делает это очень просто - по нулевому символу в конце строки. У Вас же такого нет и printf выводит до тех пор, пока такой не найдет. Вам повезло, он нашелся быстро. А могло и не повезти.

Я вот так поменяю программу и все будет работать

#include<stdio.h>
int main() {
    char a = '1';
    char b = '2';
    char c[3];
    for (int i = 0; i < 2; i++){
        if (i == 0)
            c[i] = a;
        else 
            c[i] = b;
    }
    c[2] = '\0';
    printf("%s\n",c);
    for (int i = 0; i < 2; i++) {
        printf("%c", c[i]);
    }
    return 0;
}

Можно исправить и меньшей кровью. Просто уточнить для printf кол-во символов

printf("%.2s\n",c);

ну или если не хочется хардкодить, можно даже так

printf("%.*s\n",2,c); // двойку можно вынести теперь
→ Ссылка