#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 вам придется вручную использовать массив символов. Вы можете сделать двумя способами (в первую очередь):
- Создайте статический массив символов (с достаточным размером).
- Создайте массив символов динамически с помощью
malloc
. Но в этом случае вам также придется освободить его вручную, когда массив больше не понадобится.
И, конечно, поскольку вы используете C, вам придется явно / вручную позаботиться об условиях переполнения массива, перекрытии, нулевом завершении и т.д.
Комментарии:
1. Возможно, вообще не нужно выделять хранилище. Если строки не меняются, просто сделайте так, чтобы
const
указатели указывали на литералы.2. ДА. Спасибо, что указали на это. Может быть такой случай.