Массив не может содержать одно и то же имя дважды, когда нужно добавить новую строку, программа должна проверить, есть ли уже имя

#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";