需要帮助弄清楚为什么我的Reverse String c ++程序正在破坏

时间:2012-07-30 15:27:30

标签: c++ xcode string reverse

我正试图扭转一个字符串,这只是一个简单的练习,以准备自己采访。我想编写一个程序,它接受键盘输入并在c ++中反转它。出于某种原因,我在“cin>> myString”行中收到EXC_BAD_ACCESS错误(在Xcode中)我怀疑我正在做一些非常愚蠢的事情,但我真的可以帮助找出什么是错的,以及我应该如何解决它。谢谢!

#include <iostream>
#include <cstring>
#include "stdlib.h"

using namespace std;

int main(int argc, const char * argv[])
{
    char *myString = nullptr;
    char *revString = nullptr;
    cout << "Please enter a string: ";
    cin >> myString;

    cout << endl;

    size_t myLength = strlen(myString);

    for (int i = 0; i < myLength; i++)
    {
        revString[i] = myString[myLength -1 - i];
    }

    cout << "Your string, reversed, has become: ";
    printf(revString);
    cout << endl;
}

4 个答案:

答案 0 :(得分:5)

尚未为myStringrevString分配内存。您需要使用new[]分配内存或使用std::string。如果使用new[]或使用堆栈分配的char数组,则需要限制读取的字符数以避免缓冲区溢出。使用std::string可以消除此责任,因为std::string会动态增长到所需的大小。

不确定这是否是学习练习或不允许使用STL算法,但如果是,则可以使用std::reverse()来反转std::string(请参阅此处http://ideone.com/7LZHs示例)。

答案 1 :(得分:2)

您的代码至少存在两个问题:您正在写入未分配的字符缓冲区,并且您正在从字符串的后半部分构建回文,而不是将其反转。

由于这是C ++,你不应该使用C字符串,而是更喜欢C ++字符串(std::string是你需要的类型)。您还应该交换字符串两端的字符,而不是简单地将字符从结尾部分​​分配给字符串初始部分的字符。交换字符最合适的功能是std::swap

string str = "quick brown fox jumps over the lazy dog";
for (int i = 0, j = str.size()-1 ; i < j ; swap(str[i++], str[j--]))
    ;
cout << str;

答案 2 :(得分:0)

您需要为myString分配内存。使用静态数组或新语句。

char myString[512];
char * myString = new char[512];

答案 3 :(得分:0)

问题是你正在尝试将数据塞进一个指向你可以使用的内存的指针。

此行声明指向字符的指针并将其设置为nullptr

char *myString = nullptr;

但就是这样 - 它并没有指向任何可写的内存,因此输入无处可去。 cin不为您做任何类型的内存分配。

解决此问题的一种方法是静态分配字符串:

char myString[SOME_SIZE] = "";

SOME_SIZE是一个足以容纳输入字符串的常量值。

或者您可以将其声明为std :: string,正如另一张海报所建议的那样。在C ++中,这是更安全/更好的方法,可以避免任何可能的溢出。

std::string myString;