6

重複の可能性:
文字列への書き込み時にセグメンテーション違反が発生するのはなぜですか?

ポインター演算のみでstring/を逆にする単純な C++ 関数を作成したいと考えてい ます。char[]私は概念を理解しており、コードは既に入力しています。

次の .cpp ファイルがあります。

#include <iostream>
using std::cout;
using std::endl;

void reverse(char* target) //Requirements specify to have this argument
{
    cout << "Before :" << target << endl; // Print out the word to be reversed
    if(strlen(target) > 1) // Check incase no word or 1 letter word is placed
    {
        char* firstChar = &target[0]; // First Char of char array
        char* lastChar = &target[strlen(target) - 1]; //Last Char of char array
        char temp; // Temp char to swap
        while(firstChar < lastChar) // File the first char position is below the last char position
        {
            temp = *firstChar; // Temp gets the firstChar
            *firstChar = *lastChar; // firstChar now gets lastChar
            *lastChar = temp; // lastChar now gets temp (firstChar)
            firstChar++; // Move position of firstChar up one
            lastChar--; // Move position of lastChar down one and repeat loop
        }
    }
    cout << "After :" << target << endl; // Print out end result.
}

void main()
{
    reverse("Test"); //Expect output to be 'tseT'
}

デバッガーを何度かステップ実行しましたが、そのたびにtemp = *firstCharwhile ループの行でクラッシュします。ここでフリーズし、プログラムの実行が停止して終了できなくなります。私が単に見落としているものはありますか、それともなぜこのようにできないのか、もっと深い何かがあります.

編集: else条件がありますが、簡潔にするために削除しました。それはifステートメントの後であり、単語が1文字であるか、単語が入力されていないことを促しただけです。

4

2 に答える 2

8

問題はreverse関数ではなく、呼び出しコードにあります。

reverse("Test");

文字列リテラルは読み取り専用であり、変更しようとすると未定義の動作が発生します。コンパイラの警告に注意してください (何も表示されない場合は、警告レベルを上げてください)。const char *上記の行は、非推奨の からへの変換が実行されていることに関する警告を生成しているはずchar *です。

コードを修正するには:

int main() // <-- note the return type, int NOT void!
{
  char str[] = "Test";
  reverse( str );
}
于 2012-10-22T00:10:08.353 に答える
0

このコードはそれを 2 回反転します。ループを 2 分割します。

于 2012-10-22T01:16:46.787 に答える