这里的目标不是检查一个字符串是否是回文,而是反转一个字符串。
你的代码有几个问题
-
char reversed = ""; 是错误的,反转 是 char , not a char*nor aconst char *`
-
reversed += s[i]; 没有像您预期的那样附加 s[i]
-
stringPalindrome的参数i没有意义,i必须是局部变量,不是参数
- 永远不要使用 gets,如果输入比接收数组长,则行为未定义
-
printf("%s", stringPalindrome(s,i,n)); 是未定义的行为,因为 stringPalindrome 返回 char 而不是字符串
stringPalindrome 函数不能将反向字符串存储在作为字符数组的局部变量中,然后返回具有未定义行为的数组。您可以让输入字符串保持不变:
- 在stringPalindrome中使用静态局部变量,但每次调用该函数都会修改前一次调用生成的字符串
- 使用 stringPalindrome 中的 malloc 动态分配堆中的反向字符串,在这种情况下,调用者有责任释放数组它停止使用它
- 还接收存储到反转字符串的数组 in 参数,作为 out 参数,在这种情况下,调用者有责任提供足够长的数组来存储结果
在 C 中,函数 strcat 允许连接字符串,但在您的情况下,您希望添加 one 字符,因此直接分配该字符而不是使用对 strcat 的昂贵调用(还假设两个字符串都以 null 结尾)
使用全局变量,函数必须注意不要写出它的静态数组:
#include <stdio.h>
#include <string.h>
char * stringPalindrome(const char * s, size_t n)
{
static char reversed[100];
size_t i;
if (n > sizeof(reversed) - 1)
n = sizeof(reversed) - 1;
for (i = 0; i < n; ++i)
reversed[i] = s[n - i - 1];
reversed[i] = 0;
return reversed;
}
int main()
{
char s[100];
if (fgets(s, sizeof(s), stdin) != NULL)
puts(stringPalindrome(s, strlen(s) - 1));
return 0;
}
编译和执行:
pi@raspberrypi:/tmp $ ./a.out
azer ty
yt reza
pi@raspberrypi:/tmp $
使用动态分配:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * stringPalindrome(const char * s, size_t n)
{
char * reversed = malloc(n + 1);
size_t i;
for (i = 0; i < n; ++i)
reversed[i] = s[n - i - 1];
reversed[i] = 0;
return reversed;
}
int main()
{
char s[100];
if (fgets(s, sizeof(s), stdin) != NULL) {
char * r = stringPalindrome(s, strlen(s) - 1);
puts(r);
free(r);
}
return 0;
}
编译和执行:
pi@raspberrypi:/tmp $ ./a.out
azer ty
yt reza
pi@raspberrypi:/tmp $
在输出参数中管理结果:
#include <stdio.h>
#include <string.h>
char * stringPalindrome(const char * s, char * reversed, size_t n)
{
size_t i;
for (i = 0; i < n; ++i)
reversed[i] = s[n - i - 1];
reversed[i] = 0;
return reversed;
}
int main()
{
char s[100];
char r[100];
if (fgets(s, sizeof(s), stdin) != NULL) {
puts(stringPalindrome(s, r, strlen(s) - 1));
puts(r);
}
return 0;
}
编译和执行:
pi@raspberrypi:/tmp $ gcc -Wall s.c
pi@raspberrypi:/tmp $ ./a.out
azer ty
yt reza
yt reza
pi@raspberrypi:/tmp $