2016-04-18 3 views
-1

Я новичок в C++, но очень хорошо знаком с Python. Тривиальные задачи в Python, похоже, намного сложнее в C++. Я пытаюсь сделать простую игру, где на экране печатается слово на иностранном языке, пользователь догадывается о значении, если правильно, что ему присваивается точка, и продолжайте угадывать, что значение других номеров, напечатанных на экране. Проблема, с которой я сталкиваюсь, что для курса, который я принимаю, нам не разрешено использовать только массивы символов. Причина этого не объясняется инструктором.Назначение значений массивам символов внутри массива структуры в C++

В Python, я хотел бы создать кортеж строк для чисел иностранных слов:

foreignWords = ('een', 'twee', 'drie'....) 

индекс 0 будет слово для одного на голландском языке, индекс 1 будет слово для двоих на голландском языке, и т.д. Я бы использовал функцию для случайного выбора числа от 0 до длины иностранных слов, печати на экране и т. Д. Очень просто сделать.

Я думал, что могу просто создать массив структур и strcopy массивы char в массив структур.

struct numbers 
    { 
     char numberWord[7]; 
    }; 


    int main() 
    { 
     numbers numberChoices[10]; 
     strcpy(numberChoices[0].numberWord, 'een'); 
     strcpy(numberChoices[1].numberWord, 'twee'); 
     strcpy(numberChoices[2].numberWord, 'drie'); 
     strcpy(numberChoices[3].numberWord, 'vier'); 
     strcpy(numberChoices[4].numberWord, 'vijf'): 
     strcpy(numberChoices[5].numberWord, 'zes'); 

     etc. 

Это не работает. Он выдает ошибку:

string.h:129:14: error: initializing argument 2 of ‘char* strcpy(char*, const char*)’ [-fpermissive] 
extern char *strcpy (char *__restrict __dest, const char *__restrict __src) 
      ^

Однако, если я создаю для цикла и ввести массив символов с помощью CIN >> матричная структура будет хранить свои записи, и они могут быть вызваны по индексу.

По существу, то, что я хотел бы сделать, это сделать массив массивов char таким образом, чтобы индекс мог вернуть значение и тривиально отслеживать числовое значение слова (numberChoices [i] .numberWord, i + 1 = числовое значение печатного слова). Я не знаю, подходит ли этот подход или нет, но я стараюсь быть эффективным, потому что массив структуры будет называться довольно немного, чтобы прочитать то, что хранится в памяти, сохранить это значение в новой переменной и манипулировать ссылочным символом массив, удаляя символы случайным образом, и пользователь должен угадать, какое значение имеют печатные слова.

Каков правильный способ создания массива массивов символов, где элементы массива char жестко закодированы?

+0

В C++ строки заключены в двойные кавычки: '' foo "'. Одиночные кавычки предназначены только для символов. –

+0

В C++ вы использовали бы ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector) в [' std :: string'] (http: // ru. cppreference.com/w/cpp/string/basic_string). –

+0

Кроме того, один символ 'char' является * единственным символом' char' *, он может содержать только один символ, а не строку. –

ответ

2

Ваш синтаксис кода изношен. Вы должны представлять массивы символов как "abc", но не как 'abc'.

Так что ваш код должен быть как:

numbers numberChoices[10]; 
    strcpy(numberChoices[0].numberWord, "een"); 
    strcpy(numberChoices[1].numberWord, "twee"); 
    strcpy(numberChoices[2].numberWord, "drie"); 
    strcpy(numberChoices[3].numberWord, "vier"); 
    strcpy(numberChoices[4].numberWord, "vijf"): 
    strcpy(numberChoices[5].numberWord, "zes"); 

Во-вторых вы должны помнить, что массивы символов, как "een" имеют дополнительный символ называется нулевым прекратить '\0', так что вы должны определить массив с достаточным размером для хранения ваших персонажей и что дополнительный характер , Эта концепция называется «нулевая строка завершения».

'\0' знак обязателен для правильного определения размера строки в таких функциях, как strcpy, strlen e. т. с. потому что вы не можете знать размер массива только указателем на его первый элемент (все литералы массива считаются указателями в C/C++).

0

избегать струн c-style.использовать C++ понятия:

#include <string> 
#include <array> 

struct numbers 
{ 
    std::string numberWord; 
}; 

int main() 
{ 
    numbers numberChoices[] = { 
     { "een" }, 
     { "twee" }, 
     { "drie" }, 
     { "vier" }, 
     { "vijf" }, 
     { "zes" }, 
     // ... etc 
    }; 
} 
1

В C++ существует различие между одиночными и двойными кавычками: одиночные кавычки обозначают одну характер буквального, например, 'a', '0', '\ n', тогда как для c-строк используются двойные кавычки, например. "A.u.b".

Так заменить

strcpy(numberChoices[0].numberWord, 'een'); 

с

strcpy(numberChoices[0].numberWord, "een"); 
0

Давайте игнорировать ваш курс requirestments на мгновение;

Вы не должны использовать магические указатели! вместо этого используйте карту со значимыми клавишами;

При правильной карты и строки использования ваш код может выглядеть как на примере:

#include <iostream> 
#include <vector> 
#include <string> 
#include <unordered_map> 

using foreign_word = std::string; 
using foreign_words = std::vector<foreign_word>; 

using language = std::string; 
using language_words_map = std::unordered_map<language, foreign_words>; 

int main() { 
    language_words_map lwm = { 
     { "deutch", {"een", "twee", "drie"} }, 
     /* ... and so on */ 
    }; 
    return 0; 
} 

см: http://ideone.com/BI6QjL

1

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

struct numbers 
{ 
    char numberWord[7]; 
}; 


numbers numberChoices[10] = 
{ 
    {"een"}, 
    {"twee"}, 
    {"drie"}, 
    {"vier"}, 
    {"vijf"}, 
    {"zes"}, 
    ... 
}; 
int main() 
{ 
    std::cout << numberChoices[1].numberWord << std::endl; 
} 

И если это возможно в рамках ограничений вашего назначения, дальнейшее упрощение:

const char * numberChoices[] = 
{ 
    "een", 
    "twee", 
    "drie", 
    "vier", 
    "vijf", 
    "zes", 
    ... 
}; 
int main() 
{ 
    std::cout << numberChoices[1] << std::endl; 
} 

Казалось бы, что std::string от стола для Вас. Жалость. Используйте его там, где это возможно. Это сэкономит вам массу неприятностей.

Смежные вопросы