#c
#c
Вопрос:
Как я могу написать цикл for на c , чтобы пользователь не мог дважды записать одно и то же имя в массив?
я уже пишу это
for (int i=0; i<5; i )
{
cout << i 1 <<" : ";
cin >> name[i];
if(name[i] == "empty")
{
cout << "Empty cannot be used";
return 0;
}
}
Комментарии:
1. похоже, вам может понадобиться std::set вместо обычного массива
2.
for (int j = 0; j < i; j) { if (name[i] == name[j]) { cout << "same name twicen"; return 0; } }
3. @dave использование
set
— это только половина решения, OP хочет заполнить массив 5 разными именами, если вы введете одно и то же имя в набор 5 раз, в нем будет только один элемент
Ответ №1:
std::set
является подходящим контейнером стандартной библиотеки C для моделирования имен. Это потому, что оно не может содержать дубликатов. С этой целью рассмотрим
std::set<std::string> names; // has the added bonus that names will be sorted
do {
std::string name;
std::cin >> name;
const bool contains = names.find(name) != names.end(); // Is 'name' already there?
if (contains){
// ToDo - issue an error
} else {
names.add(name); // No real need for the 'else' branch, as readding is a no-op.
}
} while (names.size() != 5);
Комментарии:
1. Вы можете альтернативно заменить
find
наinsert
и проверить его возвращаемое значение:if (!names.insert(name).second) { /* already exists */ } else { /* added */ }
Ответ №2:
Сначала вам нужно запросить пользователя, а затем выполнить цикл по массиву:
string names[5];
string name;
cout << "Enter a name: ";
cin >> name;
for (int i = 0; i < 5; i )
{
if (names[i] == name)
{
cout << "That name cannot be used";
return 0;
}
}
cout << "That name can be used";