gpt4 book ai didi

c - Head First C 反向字符串示例

转载 作者:行者123 更新时间:2023-12-02 06:47:26 24 4
gpt4 key购买 nike

我一直在学习“Head First C”,我找到了创建反转字符串方法的练习。

这是我的解决方案:

void reverse_string(char s[]) {
for (int i = strlen(s) - 1; i > -1; i--) {
printf("%c", s[i]);
}
}

这是书中的解决方案:

void reverse_string(char *s) {
size_t len = strlen(s);
char *t = s + len - 1;

while (t >= s) {
printf("%c", *t);
t = t - 1;
}

puts("");
}

我从书中理解了解决方案,但我的看起来更干净。后一种解决方案是否更可取?如果是,为什么?

最佳答案

总结评论:

首先,函数名称 reverse_string() 具有误导性,因为它不会反转字符串,而只会以相反的顺序打印它。

该函数应该采用指向 const char 的指针,而不是指向 char 的指针。有些人还可能会争辩说,在参数列表中使用 [] 有点误导,因为它可能会让不太熟悉 C 的人相信传递的是数组而不是指向其第一个元素的指针。

这两个函数都使用 printf() 打印单个字符。这涉及不必要的解析格式字符串的工作,只是为了一次输出一个字符。请改用 ´putchar()fputc()`。

这两个函数之间的功能差异:您的版本不会在反转字符串后打印换行符。书中的版本是这样做的,但就像对单个字符使用 printf() 一样,它以伪装的方式使用 puts("") 而不是 putchar ('\n').

当将空字符串传递给函数时,书中的版本可能具有未定义的行为,因为在这种情况下 t 将指向 s< 指向的数组的第一个元素之前 不能保证有效。

您的版本使用integer 来存储类型为size_tstrlen() 的结果。对于很长的字符串,integer 可能会溢出。

两种可能的解决方案:

#include <string.h>  // strlen()
#include <stdio.h> // putchar()

void print_reverse(char const *str)
{
for (char const *p = str + strlen(str); p != str; putchar(*--p));
putchar('\n');
}

或使用索引:

#include <string.h>  // strlen()
#include <stdio.h> // putchar()

void print_reverse(char const *str)
{
for (size_t i = strlen(str); i; putchar(str[--i]));
putchar('\n');
}

关于c - Head First C 反向字符串示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54760645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com