Я пытаюсь вернуть массив символов, но возвращаю только первое письмо - PullRequest
2 голосов
/ 01 апреля 2009

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

Я пытаюсь получить пользовательский ввод, сохранить его в строку, получить массив символов из строки (не спрашивайте, почему, я просто должен поместить это в массив символов), а затем получить обратный порядок фразы что пользователь вошел. Вот мой код:

#include "stdafx.h"
#include <iostream>
#include <String>
#include <cstring>

using namespace std;
using namespace System;
#pragma hdrstop

char* getCharArray(string);

string reversePhrase( int, char* );

void main(void)
{
    string sPhrase = "";
    int sSize = 0;
    string sReversed = "";
    char* cPhrase = NULL;

    cout << "Welcome to the You Type It & We'll Reverse it! [Version 1.0] " << endl;
    cout << "This program will reverse your phrase, and count how many characters are in it!" << endl;
    cout << "To begin just enter a phrase." << endl;
    cout << "Enter a phrase: ";

    getline( cin, sPhrase);

    sSize = sPhrase.length();

    cout << endl;

    cPhrase = getCharArray(sPhrase);

    sReversed = reversePhrase( sSize, cPhrase );

    cout << sReversed;

    system("pause");


}


string reversePhrase(int size , char* cPhrase)
{
    string sReversed = "";
    int place = size;

    for ( int i = 0; i < size ; i ++ )
    {
        sReversed.append(1, cPhrase[place]);
        cout << "Current string: " << sReversed << endl;
        cout << "Current character: " << cPhrase[place] << endl;
        place--;
    }

    return sReversed;
}

char* getCharArray(string sPhrase)
{
    int size = 1;
    size = sPhrase.length();

    char* cArray = NULL;
    cArray = new char[size];

    for (int i = 0 ; i < size ; i++)
    {
        cArray[size] = sPhrase.at(i);
    }

    return cArray;
}

Когда я набираю «ownage» в программе, я получаю следующее:

Error Screenshot

Это похоже на то, как будто мой массив персонажей собирает мусор, прежде чем он сможет использовать всех персонажей. Возможно, это легко исправить, но я просто не понимаю, как мне обойти это.

Ответы [ 5 ]

4 голосов
/ 01 апреля 2009

Попробуйте переписать getCharArray следующим образом

    char* getCharArray(string sPhrase)
    {
        int size = 1;
        size = sPhrase.length();

        char* cArray = NULL;
        cArray = new char[size+1]; // NOTE

        for (int i = 0 ; i < size ; i++)
        {
            cArray[i] = sPhrase.at(i); // NOTE
        }

    }

    cArray[size]=0;  // NOTE

   return cArray;
  }

Обратите внимание, что в назначении в цикле теперь используется переменная индекса. Также вам нужно выделить один дополнительный символ в массиве, чтобы установить нулевой терминатор для строки, а затем вам нужно установить его в конце.

Вам также нужно подумать об освобождении массива в какой-то момент

1 голос
/ 01 апреля 2009

обратная фраза также не верна. Попробуйте что-то вроде этого:

string reversePhrase(int size , char* cPhrase)
{
    string sReversed = "";
    sReversed.resize(size);
    int place = size - 1;

    for ( int i = 0; i < size ; i ++ )
    {
        sReversed [i] = cPhrase[place];
        cout << "Current string: " << sReversed << endl;
        cout << "Current character: " << cPhrase[place] << endl;
        place--;
    }

    return sReversed;
}
1 голос
/ 01 апреля 2009

Зачем вообще использовать массив char? Это не только бесполезно - это существенно усложняет код (использование вашей функции более сложно, и вы забыли освободить память, выделенную на new!). Почему бы просто не иметь следующую функцию:

string reverse(string const& input);

(передача аргумента по константной ссылке, а не по значению сохраняет вам копию!)

Фактически, реализация функции занимает всего одну строку с использованием возможностей класса string (один из его конструкторов занимает два итератора):

string reverse(string const& input) {
    return string(input.rbegin(), input.rend());
}
1 голос
/ 01 апреля 2009

Ошибка в этой строке:

cArray[size] = sPhrase.at(i);

То, что size должно быть вашим индексом цикла.

Вам, вероятно, стоит посмотреть на использование std::string и больше, а не ковыряться с массивами символов, когда в этом нет необходимости.

0 голосов
/ 01 апреля 2009

Сначала запустите массив с -1. После этого используйте цикл for с -1 и увеличивайте его внутри. Затем вы можете получить первый элемент массива.

...