2

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

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

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

当我在程序中输入“所有权”时,这就是我得到的返回:

错误截图

这几乎就像我的字符数组在使用所有字符之前就被垃圾收集了。这可能是一个简单的解决方法,但我只是不知道如何解决这个问题。

4

5 回答 5

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

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

您还需要考虑在某个时候释放数组

于 2009-04-01T08:43:13.897 回答
1

错误在这一行:

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

size应该是你的循环索引。

您可能应该考虑使用std::string更多,而不是在不需要时使用字符数组。

于 2009-04-01T08:37:22.913 回答
1

为什么要使用char数组?它不仅没用——它使代码大大复杂化(你的函数的使用更加困难,而且你忘记了释放由new! 分配的内存)。为什么不只具有以下功能:

string reverse(string const& input);

(通过 const 引用而不是按值传递参数可以为您节省一份副本!)

事实上,实现这个函数只需要一行使用string类的特性(它的一个构造函数需要两个迭代器):

string reverse(string const& input) {
    return string(input.rbegin(), input.rend());
}
于 2009-04-01T08:42:47.753 回答
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;
}
于 2009-04-01T08:52:12.270 回答
0

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

于 2009-04-01T10:19:22.747 回答