Что я могу использовать в C вместо «string» из C

#c #c #string

#c #c #строка

Вопрос:

Я начал играть в карточную игру на C, но я не смог найти ничего вместо string , что, очевидно, не используется в C. Вот некоторый код, где это становится препятствием:

 struct cards {
    string index;
    string colour;
};

void load_cards(cards deck[MAX_C])
{
    int i = 0;
    for (int j = 0; j < 4; j  ) {
        deck[i].index = '2';
        deck[i  = 1].index = "3";
        deck[i  = 1].index = "4";
        deck[i  = 1].index = "5";
        deck[i  = 1].index = "6";
        deck[i  = 1].index = "7";
        deck[i  = 1].index = "8";
        deck[i  = 1].index = "9";
        deck[i  = 1].index = "10";
        deck[i  = 1].index = "W";
        deck[i  = 1].index = "D";
        deck[i  = 1].index = "K";
        deck[i  = 1].index = "A";
    }
    for (int j = 0; j < 13; j  ) {
        deck[j].colour = "T";
    }
    for (int j = 13; j < 26; j  ) {
        deck[j].colour = "k";
    }
    for (int j = 26; j < 39; j  ) {
        deck[j].colour = "K";
    }
    for (int j = 39; j < 52; j  ) {
        deck[j].colour = "P";
    }
    for (int j = 52; j < 56; j  ) {
        deck[j].colour = "JR";
    }
}
  

Комментарии:

1. std::string это просто оболочка вокруг char* (это, конечно, упрощено), которая выполняет автоматическое распределение и освобождение. Вы можете использовать char* и управлять памятью вручную.

2. Если вы не используете ничего, кроме строковых литералов, таких как «JR», вам может сойти с рук const char * . Нужно посмотреть, как вы используете строки, чтобы быть уверенным. Прежде чем зайти слишком далеко, убедитесь, что перенос C на C имеет смысл. Существует довольно много идеологических различий между C и C , которые могут сделать прямой порт более трудоемким, чем он того стоит, или сделать программу на C жалко неэффективной.

3. Хотя @ Lorand прав, часть (это, конечно, упрощено) очень важна. Сначала вам нужно узнать об указателях и распределении памяти. Это сложная тема. Это не может быть объяснено здесь. Лоран, с добавлением этого предупреждения ваш комментарий квалифицируется как ответ. «Как именно?» было бы слишком широким и / или требовало руководства, т. Е. Не по теме.

4. Интересно, почему никто еще не предложил использовать enum , что даже в C было бы гораздо лучшим выбором.

5. Совершенно другое дело, что для колоды карт вам не нужно ничего похожего на string тип C !

Ответ №1:

string на самом деле это класс на C , и, как указывали другие, это оболочка вокруг массива символов / указателя (который может использоваться для хранения последовательности chars ).

В C вам придется вручную использовать массив символов. Вы можете сделать двумя способами (в первую очередь):

  1. Создайте статический массив символов (с достаточным размером).
  2. Создайте массив символов динамически с помощью malloc . Но в этом случае вам также придется освободить его вручную, когда массив больше не понадобится.

И, конечно, поскольку вы используете C, вам придется явно / вручную позаботиться об условиях переполнения массива, перекрытии, нулевом завершении и т.д.

Комментарии:

1. Возможно, вообще не нужно выделять хранилище. Если строки не меняются, просто сделайте так, чтобы const указатели указывали на литералы.

2. ДА. Спасибо, что указали на это. Может быть такой случай.