-3

次の文字列へのポインターの配列に格納されている文字列を逆にするプログラムを作成します。

char *s[ ] = {
  "To err is human...",
  "But to really mess things up...",
  "One needs to know C!!"
};

ヒント: xstrrev ( string )1 つの文字列の内容を逆にする関数を書きます。に格納されている各文字列を反転するには、この関数を呼び出しますs

このコードで正しい出力が得られないのはなぜですか?

#include "stdafx.h"
#include "conio.h"
#include "stdio.h"
#include "string.h"

using namespace System;

void xstrrev (char str[])
{
    int i,l;
    char temp;
    l=strlen(str);

    for (i=0;i<(l/2);++i)
    {
        temp=*(str+i);
        *(str+i)=*(str+i+l-1);
        *(str+i+l-1)=temp;
    }
}

void main ()
{
char *s[] = {
        "To err is human...",
        "But to really mess things up...",
        "One needs to know C!!"
    };
    xstrrev(s[0]);
    xstrrev(s[1]);
    xstrrev(s[2]);
    puts(s[0]);
    puts(s[1]);
    puts(s[2]);
    getch();
}
4

1 に答える 1

0

の宣言であなたが間違っていることだけに気付くことができますかs[]s[]次のように main() で宣言する必要があります。

char str1[] = "To err is human...";
char str2[] = "But to really mess things up...";
char str3[] = "One needs to know C!!";
char *s[] = { str1, str2, str3};

理由:

あなたが好きなら:

char* str = "yourname";
str[2] = 'c';    // you are trying to write on read only memory

読み取り専用メモリに書き込もうとしています。セグメンテーション違反の原因 (未定義の動作)str定数文字列リテラルを指しているためです。

あなたが好きならどこにいますか:

char str[] = "yourname";
str[2] = 'c';    // ok no error

今回str[]は配列文字列であり、その値とサイズは宣言の時点で定義されているため、問題ありません。

アルゴリズム的にはあなたが正しいと思います

編集 して、私は正しいです。私の提案Codepadの後にコードが機能しているのを見てください 。@carlNormの言ったことは正しいです。彼はまた、良いリンクを投稿しました。

于 2013-03-25T19:37:26.563 に答える