c ++ хранит список символов из функции char * - PullRequest
0 голосов
/ 01 мая 2018

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

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;
}

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вы должны вернуть 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 с последним измененным положением для удаления дублированных символов 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
//...

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

0 голосов
/ 01 мая 2018

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...