我正在尝试返回一个字符数组但是,我只收到第一个字母

时间:2009-04-01 08:33:44

标签: c++ arrays string pointers return-value

我正在为学校做一件小事。经过几个小时的研究,以及大量的错误和逻辑改造,我几乎完成了我的小程序。

我正在尝试接受用户输入,将其存储到字符串中,从字符串中获取字符数组(不要问为什么,我只需将其放入字符数组中),然后获取短语的颠倒顺序用户输入的内容。这是我的代码:

#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

这几乎就像我的Character Array在使用所有字符之前收集垃圾。这可能是一个简单的解决办法,但是,我只是看不出如何解决这个问题。

5 个答案:

答案 0 :(得分:4)

尝试像这样重写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;
  }

请注意,循环中的赋值现在使用索引变量。此外,您需要在数组中分配一个额外的char来为字符串设置null终止符,然后您需要在结尾处设置它。

你还需要考虑在某个时候解除分配数组

答案 1 :(得分:1)

错误就在这一行:

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

size应该是你的循环索引。

你应该考虑更多地使用std::string,而不是在没有必要时使用字符数组。

答案 2 :(得分:1)

为什么要使用char数组呢?它不仅无用 - 它使代码大大复杂化(函数的使用更加困难,而且您忘记释放new分配的内存!)。为什么不具备以下功能:

string reverse(string const& input);

(通过const引用而不是按值传递参数可以保存副本!)

实际上,使用string类的功能(其中一个构造函数需要两个迭代器)实现该函数只需要一行:

string reverse(string const& input) {
    return string(input.rbegin(), input.rend());
}

答案 3 :(得分:1)

reversePhrase也不正确。尝试这样的事情:

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

答案 4 :(得分:0)

首先,使用-1启动数组。之后,使用带有-1的for循环并在循环内增加。然后,您可以获得数组的第一个元素。