在这段代码中,我试图使用函数来反转一个字符串。我使用了一个指针数组来存储一些数组。*(*(string+i)+j)
这一行适用于i=0
但i
但i=1
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;
}
它会产生分段错误。我无法理解可能出现的问题。
{{1}}
答案 0 :(得分:3)
这里有很多问题:
temp中的指针未初始化,temp是本地堆栈数组。您无法退货,因为它将超出范围
您没有对“reverse”
您的初始数组大小为3,而不是大小2.
无需使用令人困惑的(*(string + i)+ j)表示法。 string [i] [j]也可以正常工作,并且更具可读性。
反转后,您不会终止字符串。你需要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
答案 1 :(得分:1)
声明了您的变量char *temp[2];
但从未分配任何内存(使用malloc等)。因此它指向未定义的内存位置。我认为这会导致您的细分错误。
它适用于i = 0可能是运气:o I.e. temp [0]包含一个char *,它可以指向有效的内存,但temp [1]可能不会(seg fault)。您需要在使用之前分配内存。
temp[i] = malloc(strlen(string[i]));
或者像这样......
答案 2 :(得分:0)
final的类型为“char * final [2]”,但你的循环是
for(i=0;i<=2;i++)
puts(final[i]);
给了我3个。
答案 3 :(得分: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");
}
}