1

在这段代码中,我试图使用函数来反转字符串。这里我使用了一个指针数组来存储一些数组。*(*(string+i)+j)这条线适用,i=0但一旦i增加i=1它就会给出分段错误。我无法理解可能是什么问题。

#include<stdio.h>
#include<string.h>
char**reverse(char**);
int main()
{
    char *final[2],*s[] = {
      "To err is human...",
      "But to really mess things up...",
      "One needs to know C!!"
      } ;
    int i;
    for(i=0;i<=2;i++)
        puts(s[i]);
    reverse(s);
    for(i=0;i<=2;i++)
        puts(final[i]);
    return 0;
}
char** reverse(char*string[2])
{   
    char *temp[2];
    int len,i,j,k;
    for(i=0;i<=2;i++)
    {
        len=strlen(string[i]);
        k=0;
        for(j=len-1;j>=0;j--)
        {   
            *(*(temp+i)+k)=*(*(string+i)+j);
            /*this line work for i=0 but give segmentation fault for i=1;*/

            printf("%c",*(*(temp+i)+k));
            k++;
        }
        printf("\n");

    }
    return temp;
}
4

4 回答 4

3

这里有很多问题:

  1. temp 中的指针未初始化,temp 是本地堆栈数组。你不能退货,因为它会超出范围

  2. 你没有对'reverse'的返回值做任何事情

  3. 您的初始数组大小为 3,而不是大小 2。

  4. 没有必要使用令人困惑的 (*(string+i)+j) 表示法。string[i][j] 也能正常工作,而且可读性更强。

  5. 反转它们后,您不会终止您的字符串。你需要 temp[i][k]='\0'; 在 for 循环之后执行此操作。

对您的代码进行最简单的修改以提供您想要的结果可能是这样的。

#include<stdio.h>
#include<string.h>
#include<malloc.h>

char**reverse(char**);

int main()
{
    char **final,*s[] = {
    "To err is human...",
    "But to really mess things up...",
    "One needs to know C!!"
    } ;
    int i;
    for(i=0;i<=2;i++)
    puts(s[i]);
    final = reverse(s);
    for(i=0;i<=2;i++)
    puts(final[i]);
    return 0;
}

char**reverse(char*string[3])
{
    char **temp = malloc(sizeof(char*) * 2);
    int len,i,j,k;

    for (int i=0; i < 3; i++)
    {
        temp[i] = malloc(sizeof(char) * 512);
    }

    for(i=0;i<=2;i++)   
    {
        len=strlen(string[i]);
        k=0;
        for(j=len-1;j>=0;j--)
        {   
            *(*(temp+i)+k)=*(*(string+i)+j);
            printf("%c",*(*(temp+i)+k));
            k++;
        }
        temp[i][k]='\0';
        printf("\n");
    }
    return temp;
}

程序输出为:

人非圣贤孰能...

但是真的把事情搞砸了……

一个人需要知道C!

... namuh si rre oT

...pu sgniht ssem yllaer ot tub

!!C wonk ot sdeen enO

于 2013-10-30T07:39:10.133 回答
1

您的变量char *temp[2];已声明但从未分配任何内存(使用 malloc 等)。因此它指向未定义的内存位置。我认为这是导致您的分段错误的原因。

它适用于 i = 0 可能是运气:o 即 temp[0] 包含一个可能指向有效内存的 char*,但 temp[1] 可能不是(段错误)。您需要在使用之前分配内存。

temp[i] = malloc(strlen(string[i]));

或者类似的东西......

于 2013-10-30T07:38:11.633 回答
0

我已经修改了您的代码,如下所示,我运行了代码并且它有效!我希望这对你有帮助。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void reverse(char**);

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

    for(i=0;i<=2;i++)
        puts(s[i]);
    //reverse the string!
    reverse(s);
    for(i=0;i<=2;i++)
        puts(s[i]);

    return 0;
}

//function to reverse the string
void reverse(char*string[2])
{   
    char *temp;
    int len,i,j,k;
    for(i=0;i<=2;i++)
    {
        len=strlen(string[i]);
        k=0;
        temp = (char *)malloc((len * sizeof(char)) + 1);
        for(j=len-1;j>=0;j--)
        {   
            temp[k] = string[i][j];
            printf("%c",temp[k]);
            k++;
        }
        temp[k] = '\0';
        //puts(temp[i]);
        string[i] = temp;  // after reversing the string store it back to string!
        printf("\n");

    }
}
于 2013-10-30T08:06:49.790 回答
0

final 的类型是 "char *final[2]" 但你的循环是

for(i=0;i<=2;i++)
    puts(final[i]);

这给了我3。

于 2013-10-30T07:37:59.170 回答