我正试图扭转一个字符串,这只是一个简单的练习,以准备自己采访。我想编写一个程序,它接受键盘输入并在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;
}
答案 0 :(得分:5)
尚未为myString
或revString
分配内存。您需要使用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;