Обращение строки в C ++ с использованием указателей - PullRequest
0 голосов
/ 11 января 2019
void reverse(char[] x) {
    char* pStart = x;
    char* pEnd = pStart + sizeof(x) - 2;
    while(pStart < pEnd) {
        char temp = *pStart;
        *pStart = *pEnd;
        *pEnd = temp;
        pStart++;
        pEnd--;
    }
}

int main() {
    char text[] = ['h','e','l','l','o'];
    reverse(text);
    cout << text << endl;
    return 0;
}

Я новичок в C ++ и переполнение стека.

Я пытаюсь перевернуть строку, используя указатели ... Я не совсем понимаю, что я сделал не так. Пожалуйста, помогите мне.

Дополнительный вопрос: в чем разница между строкой и массивом символов?

Ответы [ 2 ]

0 голосов
/ 12 января 2019

char x[] - это то же самое, что и char* x, поэтому sizeof(x) - это размер указателя. Поэтому, поскольку вы не можете вычислить размер массива вне блока, в котором он объявлен, я исключил бы эту часть из вашей функции.

Было бы намного проще снабдить функцию указателями на первый и последний заменяемые символы:

void reverse(char* pStart, char* pEnd)
{
    while (pStart < pEnd)
    {
        char temp = *pStart;
        *pStart   = *pEnd;
        *pEnd     = temp;
        pStart++;
        pEnd--;
    }
}

Так что теперь эту функцию довольно легко вызвать - взять адрес (используя амперсанд &) соответствующих символов в массиве: &text[0] и &text[4].

Для отображения массива символов существует правило, что такие "строки" ДОЛЖНЫ иметь после последнего символа НУЛЕВЫЙ символ. NULL-символ может быть записан как 0 или '\0'. Вот почему он должен быть добавлен в массив здесь.

int main()
{
    // char text[] = "hello"; // Same like below, also adds 0 at end BUT !!!in read-only memory!!
    char text[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
    reverse(&text[0], &text[4]);

    std::cout << text << std::endl;
    return 0;
}
0 голосов
/ 11 января 2019

sizeof(x) с x, являющимся параметром типа char[] функции, дает не количество символов в строке, а размер char*, вероятно 8 в 64-битной системе , Вам нужно передать C-String и использовать вместо него strlen(x). Напишите char text[] = {'h','e','l','l','o','\0'} или char text[] = "hello" в main.

Обратите внимание, что sizeof() должен оцениваться во время компиляции; это невозможно для массивов с неопределенным размером, таких как аргументы функции char[]. Однако при использовании sizeof для таких переменных, как char text[] = {'h','e','l','l','o'}, sizeof(text) приведет к фактическому размеру массива.

...