我已经完成了一个函数,它反转了参数中给出的String(字符数组),但它不起作用,不知道为什么?
我得到的是这样的东西:æIGt(Kt $ 0 @
谢谢你
#include <stdio.h>
#include <string.h>
char *
inverse(char *s)
{
int i, taille = strlen(s);
char r[taille];
for (i = 0 ; i < taille ; i++)
{
r[i] = s[taille - i - 1];
}
r[i] = '\0';
return r;
}
int
main()
{
char s[] = "kira";
char *r = inverse(s);
printf("%s",r);
return 1;
}
答案 0 :(得分:7)
您正在返回指向局部变量的指针。当函数inverse返回时,该变量被破坏,因此在函数退出后访问指针将返回无效数据。
答案 1 :(得分:4)
很难从你的问题中判断出来,因为你还没有给出任何输出,但我最好的猜测是,因为你返回指向堆栈上项目的指针,在您的情况printf
中,下一次调用会覆盖它。你需要通过inverse
一个地方来回答它。试试这个:
#include <stdio.h>
#include <string.h>
void inverse(char *s, char *r)
{
int i,taille=strlen(s);
for(i=0;i<taille;i++)
{
r[i]=s[taille-i-1];
}
r[i]='\0';
}
int main()
{
char s[] = "kira";
char r[sizeof(s)];
inverse(s, r);
printf("%s",r);
return 1;
}
答案 2 :(得分:1)
另一种反转字符串的标准方法是使用指针在字符串的开头和结尾处工作,每次迭代交换两个字符。它将原始字符串交换到位(如果需要保留原始字符串,请复制一份,或者传递第二个字符串并将反向字符串放在那里)
/** strrevstr - reverse string, swaps 2 chars per-iteration.
* Takes valid string and reverses, original is not preserved.
* If 's' is valid and non-empty, returns pointer to 's',
* returns NULL otherwise.
*/
char *strrevstr (char *s)
{
if (!s || !*s) { /* validate string is not NULL and non-empty */
printf ("strrevstr() error: invalid string\n");
return NULL;
}
char *begin = s; /* pointers to beginning and end, and tmp char */
char *end = begin + strlen (s) - 1;
char tmp;
while (end > begin) /* swap both beginning and end each iteration */
{
tmp = *end;
*end-- = *begin;
*begin++ = tmp;
}
return s;
}
正如您所知,有很多方法可以解决这个问题,提供这个和其他答案,您应该能够定制解决方案以满足您的需求。
每种方法都有优点和缺点。动态分配新的内存块来保存反向字符串没有任何问题,它只是增加了一个额外的责任:(1)保留指向新块的起始地址的指针,以便(2)它不再能够被释放需要。如果需要保留原始字符串,则将指针传递给足够大小的字符数组以保存反转字符串是保留原始字符串的另一个选项。
查看所有答案,如果您有任何疑问,请与我们联系。