1

我正在尝试反转一个字符串,就像一个简单的练习,让自己为面试做准备。我想用 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

4 回答 4

5

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

不确定这是学习练习还是不允许使用 STL 算法,但如果是,您可以使用它们std::reverse()来反转 a std::string(参见此处的示例http://ideone.com/7LZHs)。

于 2012-07-30T15:30:23.537 回答
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;
于 2012-07-30T15:30:01.483 回答
0

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

char myString[512];
char * myString = new char[512];
于 2012-07-30T15:29:59.900 回答
0

问题是您试图将数据塞入一个不指向您可以使用的内存的指针中。

这一行声明了一个指向字符的指针并将其设置为nullptr

char *myString = nullptr;

但仅此而已 - 它不指向任何可写内存,因此输入无处可去。cin不会为您进行任何类型的内存分配。

解决它的一种方法是静态分配您的字符串:

char myString[SOME_SIZE] = "";

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

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

std::string myString;
于 2012-07-30T15:34:43.850 回答