需要帮助弄清楚为什么我的反向字符串c++程序正在崩溃
Need help figuring out why my Reverse String c++ program is breaking
我正试图反转一个字符串,这只是为面试做准备的一个简单练习。我想用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;
}
尚未为myString
或revString
分配内存。您需要使用new[]
或std::string
来分配内存。如果使用new[]
或使用堆栈分配的char
数组,则需要限制读取的字符数以避免缓冲区溢出。使用std::string
可以免除您的责任,因为std::string
将动态增长到所需的大小。
不确定这是一个学习练习还是STL算法是不允许的,但如果是,您可以使用std::reverse()
来反转std::string
(参见此处的示例http://ideone.com/7LZHs)。
您的代码至少有两个问题:您正在向未分配的字符缓冲区写入,并且您正在从字符串的后半部分构造回文,而不是反转它。
由于这是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;
您需要为myString分配内存。使用静态数组或新语句。
char myString[512];
char * myString = new char[512];
问题是您正试图将数据填充到一个指针中,该指针不指向您可以使用的内存。
这一行声明了一个指向字符的指针,并将其设置为nullptr
:
char *myString = nullptr;
但就是这样——它不指向任何可写的内存,所以输入没有有效的位置。cin
不会为您进行任何内存分配。
一种解决方法是静态分配字符串:
char myString[SOME_SIZE] = "";
其中SOME_SIZE
是一个常量值,其大小足以容纳输入字符串。
或者,您可以将其声明为std::字符串,正如另一位发帖者所建议的那样。在C++中,这是避免任何可能的溢出的更安全/更好的方法。
std::string myString;