我正在为学校做一件小事。经过几个小时的研究,以及大量的错误和逻辑改造,我几乎完成了我的小程序。
我正在尝试接受用户输入,将其存储到字符串中,从字符串中获取字符数组(不要问为什么,我只需将其放入字符数组中),然后获取短语的颠倒顺序用户输入的内容。这是我的代码:
#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”时,这就是我返回的内容:
这几乎就像我的Character Array在使用所有字符之前收集垃圾。这可能是一个简单的解决办法,但是,我只是看不出如何解决这个问题。
答案 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
循环并在循环内增加。然后,您可以获得数组的第一个元素。