反转存储在指针数组中的字符串

时间:2013-03-25 18:27:23

标签: c++ string pointers reverse

  

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

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();
}

1 个答案:

答案 0 :(得分:0)

在宣告s[]时,我是否只能注意到你做错了。您应该在main()中声明s[],如下所示:

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说的是正确的。他还发布了一个很好的链接。