C++ хранит список символов из функции char *

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

char *removeDuplicate(char str[], int n)
{
// Used as index in the modified string
int index = 0;

// Traverse through all characters
for (int i=0; i<n; i++) {

 // Check if str[i] is present before it
 int j;
 for (j=0; j<i; j++)
    if (str[i] == str[j])
       break;

 // If not present, then add it to
 // result.
 if (j == i)
    str[index++] = str[i];
}

return str;
}

Можете ли вы более конкретно рассказать о том, что вы пытаетесь сделать?

Johnny Mopp 01.05.2018 20:14

И std::string, и std::vector<char> в целом работают очень хорошо для данных строкового типа на основе char. В этом конкретном случае std::set<char> может быть вариантом.

Eljay 01.05.2018 20:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
214
2

Ответы 2

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

Скажем, вы используете:

char title[] = "mission impossible";
removeDuplicate(title, strlen(title));

Вы можете использовать title после звонка на removeDuplicate. Он будет обновлен после вызова функции.

Вы должны вернуть std::string, если это возможно для вашего контекста, или выделенный указатель на char*. Я покажу вам пример для std::string:

std::string removeDuplicate(char str[], int n)
{
    // Used as index in the modified string
    int index = 0;

    // Traverse through all characters
    for (int i=0; i<n; i++) {

        // Check if str[i] is present before it
        int j;
        for (j=0; j<i; j++)
            if (str[i] == str[j])
                break;

        // If not present, then add it to
        // result.
        if (j == i)
            str[index++] = str[i];
    }

    return std::string(str, str + index);
}

int main()
{
    char test[] = "tttsetst";

    std::string retStr = removeDuplicate(test, strlen(test)); // value is "tse"
    return 0;
}

При возврате мы инициализируем std :: string с последним измененным pos, чтобы удалить повторяющиеся символы std::string(str, str + index);

Или, если вы вообще не хотите возвращать значение, вы можете пометить свой str, переданный в функцию, с помощью '\ 0' в необходимом индексе, чтобы установить новый конец строки, и он сохранит свое значение после выхода из функции. Потому что str [] передается по указателю. Посмотрите код:

void removeDuplicate(char str[], int n)
{
    // Used as index in the modified string
    int index = 0;

    // Traverse through all characters
    for (int i=0; i<n; i++) {

        // Check if str[i] is present before it
        int j;
        for (j=0; j<i; j++)
            if (str[i] == str[j])
                break;

        // If not present, then add it to
        // result.
        if (j == i)
            str[index++] = str[i];
    }

    //mark end of the string
    str[index] = '\0';
}

//...
char test[] = "tttsetst";
removeDuplicate(test, strlen(test)); // test value is "tse" after leaving function
//...

Кроме того, это будет дешевле, вам не нужно выделять новые переменные для хранения фиксированных строковых данных.

Другие вопросы по теме