Хранение нескольких строк во вложенной структуре

У меня есть 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.

ПРИМЕЧАНИЕ. Я не могу изменить массив

Я хочу знать, что вызывает проблему. Это определение структуры?

с и с++ это разные языки. Пожалуйста, выберите один.

wohlstad 27.11.2022 07:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, это. Проблема в том, что строки в стиле C требуют один дополнительный символ для хранения нулевого терминатора. Это символ '\0', который ставится в конце каждой строки в стиле C. Таким образом, для хранения такой строки, как "CELL", требуется массив размером 5, а не 4.

Конечно, вы все еще можете хранить 4 символа 'C', 'E', 'L''L' в массиве размера 4. Просто тогда это уже не строка в стиле C, потому что у нее больше нет нулевого терминатора. Если это то, что вы хотите сделать, вам придется принять специальные меры при обработке данных (например, при печати).

Эй, Джон, спасибо за твой ответ. Могу ли я узнать, что я должен сделать, чтобы исправить эту вещь. Поскольку длина строки уже определена с помощью макроса, а также уже определена функция отображения, которая просто напрямую печатает phone.description, например printf(phone.description);

Manraj Singh 27.11.2022 07:32

@ManrajSingh Если ваш код такой, то в нем есть ошибка. Невозможно исправить ошибку без изменения кода.

john 27.11.2022 07:33

@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);

Remy Lebeau 27.11.2022 07:41

Другие вопросы по теме