У меня есть 2 структуры с именами Phone и Patient соответственно:
struct Phone{
char description[4];
char number[10];
};
struct Patient{
int id;
char name[15];
struct Phone phone;
};
Теперь при создании массива пациентов, например:
struct Patient patient = [
{1024, "Shaggy Yanson", {"CELL","3048005191"} },
]
После печати значения описания телефона я получаю вывод как CELL3048005191.
ПРИМЕЧАНИЕ. Я не могу изменить массив
Я хочу знать, что вызывает проблему. Это определение структуры?





Да, это. Проблема в том, что строки в стиле C требуют один дополнительный символ для хранения нулевого терминатора. Это символ '\0', который ставится в конце каждой строки в стиле C. Таким образом, для хранения такой строки, как "CELL", требуется массив размером 5, а не 4.
Конечно, вы все еще можете хранить 4 символа 'C', 'E', 'L''L' в массиве размера 4. Просто тогда это уже не строка в стиле C, потому что у нее больше нет нулевого терминатора. Если это то, что вы хотите сделать, вам придется принять специальные меры при обработке данных (например, при печати).
Эй, Джон, спасибо за твой ответ. Могу ли я узнать, что я должен сделать, чтобы исправить эту вещь. Поскольку длина строки уже определена с помощью макроса, а также уже определена функция отображения, которая просто напрямую печатает phone.description, например printf(phone.description);
@ManrajSingh Если ваш код такой, то в нем есть ошибка. Невозможно исправить ошибку без изменения кода.
@ManrajSingh printf(phone.description); требует нулевого ограничителя (он также имеет неопределенное поведение, если строка содержит любой символ %). Чтобы напечатать строку, не имеющую ограничителя nul, вы можете указать максимальную длину в спецификаторе %s для printf(), то есть printf("%.4s", phone.description); printf("%.10s", phone.number); или, если длины указаны в макросах: printf("%.*s", (int)desc_length_here, phone.description); printf("%.*s", (int)number_length_here, phone.number);
с и с++ это разные языки. Пожалуйста, выберите один.