-3

编写一个程序来反转存储在以下指向字符串的指针数组中的字符串:

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

提示:编写一个函数xstrrev ( string ),它应该反转一个字符串的内容。调用此函数以反转存储在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 回答