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またはにメモリが割り当てられていませんrevStringnew[]またはを使用してメモリを割り当てる必要がありますstd::string。を使用する場合new[]、またはスタックに割り当てられた の配列を使用する場合charは、バッファ オーバーランを回避するために読み取る文字数を制限する必要があります。を使用すると、必要なサイズに動的に拡大するため、std::stringこの責任が取り除かれます。std::string

これが学習課題なのか、STL アルゴリズムが許可されていないのかはわかりませんが、許可されている場合はstd::reverse()逆に使用できます ( http://ideone.com/7LZHsstd::stringの例を参照)。

于 2012-07-30T15:30:23.537 に答える
2

コードには少なくとも 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メモリの割り当ては一切行いません。

これを修正する 1 つの方法は、文字列を静的に割り当てることです。

char myString[SOME_SIZE] = "";

SOME_SIZE入力文字列を保持するのに十分な大きさの定数値はどこにありますか。

または、別のポスターで提案されているように、代わりに std::string として宣言することもできます。C++ では、オーバーフローの可能性を回避するために、これがより安全で優れた方法です。

std::string myString;
于 2012-07-30T15:34:43.850 に答える