有人可以告诉我我的代码有什么问题吗? 它显示了一些奇怪的输出。
#include<stdio.h>
#include<string.h>
void reverse(char string[])
{
char b[200];
int t;
t = strlen(string);
if (t==1)
printf("%c",string[0]);
else
{
printf("%c",string[t-1]);
for (int i=0;i<t-1;i++)
b[i]=string[i];
reverse(b);
}
}
int main()
{
char a[200];
scanf("%s",&a);
reverse(a);
return 0;
}
最佳答案
如果您尝试使用调试器,您会看到 t
在第二次迭代中变得疯狂。这是因为您复制了string
之后进入b
您忘记插入\0
符号位于末尾(索引为 t-1
的位置)。这会导致t
由于 strlen()
在下一次迭代中成为字面上的任何东西需要一个空终止字符串,它会导致未定义的行为,如 docs 中所述。 :
The behavior is undefined if str is not a pointer to a null-terminated byte string
因此,快速修复如下:
...
for (int i=0;i<t-1;i++)
{
b[i]=string[i];
}
b[t-1] = '\0';
reverse(b);
...
正如 @LPs 的评论中已经提到的:更改 scanf("%s",&a);
至scanf("%199s",a);
(199因为我们需要在末尾留一个空格“\0”,感谢@RoadRunner注意到这一点)
注意:看看 strncpy_s
(如果您使用 C11)并使用它代替 for
循环:
printf("%c",string[t-1]);
strncpy_s(b, 200, string, t-1); // 200 because char b[200]
reverse(b);
或strncpy
:
printf("%c",string[t-1]);
strncpy(b, string, t-1);
b[t-1] = '\0';
reverse(b);
还有一种方法是不复制:
else
{
string[t-1] = '\0'; // you don't need array 'b' at all
reverse(string);
}
最简单的方法就是使用循环:
for (int i = strlen(string) - 1; i >= 0; --i)
{
printf("%c", string[i]);
}
关于c - 使用递归反转字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41871682/