有几种实现方法reverse()
,具体取决于传入函数的字符串是否要修改。
如果唯一的目的是以相反的顺序打印字符串,而不是更改存储,那么您可以使用:
void print_reverse_string(const char *str)
{
const char *src = str + strlen(str);
while (src > str)
putchar(*--src);
}
如果目标是反转存储中的字符串并打印它,那么您可以使用:
void reverse_string_and_print(char *str)
{
if (*str == '\0')
return;
char *src = str;
char *end = src + strlen(src) - 1;
while (end > src)
{
char t = *end;
*end-- = *src;
*src++ = t;
}
printf("%s", str);
}
第二个函数设计得很糟糕,因为它做了两个工作。最好有一个void reverse(char *str)
在原位反转字符串的函数,然后从调用代码中打印它。
void reverse(char *str)
{
if (*src == '\0')
return;
char *src = str;
char *end = src + strlen(src) - 1;
while (end > src)
{
char t = *end;
*end-- = *src;
*src++ = t;
}
}
这可能以一种不可能的方式声称是通用功能reverse_string_and_print()
。
请注意,在 for 的表达式中减去 1 时,对空字符串的测试可避免未定义行为 (UB) end
。它伤害的机会很小,但应始终避免UB。
#include <stdio.h>
#include <string.h>
void print_reverse_string(const char *str)
{
const char *src = str + strlen(str);
while (src > str)
putchar(*--src);
}
void reverse_string_and_print(char *str)
{
char *src = str;
char *end = src + strlen(src) - 1;
while (end > src)
{
char t = *end;
*end-- = *src;
*src++ = t;
}
printf("%s", str);
}
int main(void)
{
const char fixed[] = "Hello World!";
print_reverse_string(fixed);
putchar('\n');
printf("%s\n", fixed);
char data[] = "Hello World!";
reverse_string_and_print(data);
putchar('\n');
printf("%s\n", data);
return(0);
}
示例输出
$ ./rv
!dlroW olleH
Hello World!
!dlroW olleH
!dlroW olleH
$