Поиск элемента в массиве и добавление его в конец массива, если он отсутствует

#c #arrays

#c #массивы

Вопрос:

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

 #include <iostream> 
using namespace std; 
  


string updateList(char arr[],char key, int n);

int main() 
{ 
    char usernames[10];
    int sizeOf = 2;
    usernames[0] = 'a'; usernames[1] = 'b';
    string x = updateList(usernames, 'c', sizeOf);
    cout << x;
}
string updateList(char arr[],char key, int n) 
{ 
    int arrLength = sizeof(arr)/sizeof(char);
    int i; 
    for (i = 0; i < arrLength; i  ) {
        if (arr[i] == key) {
            return "Username already exists";}
        else {
            arr[n  ] = key;
            int arrLength = sizeof(arr)/sizeof(char);
            for (i = 0; i < arrLength; i  ) {
                cout << arr[i];
                return "n Username added";
             }
            
 } }
}
  

Будем признательны за любую помощь.

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

1. размер массива равен 10 characters…it исправлено. Я думаю, что это должно быть динамическим

2. Ваш код не будет компилироваться. Пожалуйста, исправьте это.

3. В вашем случае sizeof(arr) не даст вам размер массива. Лучше использовать std::array , если размер известен во время компиляции, или std::vector , если нет

4. Если вы не заблокированы массивом C, вы можете использовать std::vector en.cppreference.com/w/cpp/algorithm/find

5. Абсолютно правильно. В моем коде было несколько серьезных ошибок, спасибо, что указали на них @TedLyngmo

Ответ №1:

Проблема с вашим подходом заключается в том, что вы не обновляете значение n (sizeOf) и используете n для добавления элемента, который создаст ошибку. вместо этого используйте передачу по ссылке, чтобы n (то есть, e здесь sizeOf будет обновлен) обновился, попробуйте что-то вроде

 #include <iostream> 
using namespace std; 
  


string updateList(char arr[],char key, int *n);

int main() 
{ 
    char usernames[10];
    int sizeOf=2;
    usernames[0] = 'a'; usernames[1] = 'b';
    string x = updateList(usernames, 'c', amp;sizeOf);
    cout << x;

int updateList(char arr[],char key, int n) 
{ 
    int i; 
    for (i = 0; i < arrLength; i  ) {
        if (arr[i] == key) {
            return "Username already exists";}
        else {
            arr[n  ] = key;
            for (i = 0; i < arrLength; i  ) {
                cout << arr[i];
             }
            
    return 0; } }
}
  

Ответ №2:

Вы можете использовать string или vector, чтобы поддерживать динамичность массива символов. Это пример строки, и он также действует как массив символов.

 #include <iostream> 
using namespace std; 
int main() 
{ 
    string usernames="ab";
    char key = 'b';
    int i=0;
    for(;i<usernames.size();i  )
        if(usernames[i]==key)
        {
            printf("Key exists already");
            break;
        }
    if(i==usernames.size())
    {
          usernames.push_back(key);
          cout << usernames <<endl;
    }  
    return 0;
}