鱼C论坛

 找回密码
 立即注册
查看: 561|回复: 4

[已解决]s1e39动动手1

[复制链接]
发表于 2023-6-12 22:15:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//编写一个函数,功能是将传入的字符串前后翻转,
这个*reverse_str(char *str)函数也不太懂(包括返回值),char *get_str(void)这个函数最后的返回值为啥是这个char *get_str(void)
#include <stdio.h>
#include <stdlib.h>

#define INCREMENT 10
#define INIT_SIZE INCREMENT//开头这两个宏定义啥意思捏

char *get_str(void)
{
        char ch;
        char *str; // 存储整个数据的首地址
        char *last; // 最近一次迭代的起始地址
        int limit = 0; // 每次迭代的限制值
        long times = 1; // 记录重新申请多少次内存

        str = (char *)malloc(INIT_SIZE);
        if (str == NULL)
        {
                exit(1);
        }

        last = str;

        printf("请输入一个字符串:");

        while ((ch=getchar()) != '\n')
        {
                last[limit++] = ch;
                if (limit >= INCREMENT)
                {
                        int offset = last - num;
                        num = (char *)realloc(num, INIT_SIZE + INCREMENT * times++);
                        last = num;
                        last += offset;
                        last += INCREMENT;
                        limit = 0;
                }
        }
        last[limit] = '\0';

        return str;
}

char *reverse_str(char *str)
{
        char *start = str;
        char *left = str;
        char ch;

        if (str != NULL)
        {
                // 定位到字符串的最后一个字符
                while (*str++)
                        ;
                str -= 2;

                while (left < str)
                {
                        ch = *left;
                        *left++ = *str;
                        *str-- = ch;
                }
        }

        return start;
}

int main(void)
{
        char *str;

        str = get_str(); // 这个get_str函数也就是上一题的答案
        str = reverse_str(str);
        printf("前后翻转后的结果:%s\n", str);

        return 0;
}
最佳答案
2023-6-12 22:28:12
这个代码的主要功能是接收用户输入的一个字符串,然后将这个字符串反转,最后打印出反转后的字符串。我会逐一回答你的问题。

1. 关于  char *get_str(void)  函数的返回值:
   这个函数的返回值是一个字符串(字符指针),它接收用户输入的字符串并返回。所以它的返回值类型是  char * 。

2. 关于  #define INCREMENT 10  和  #define INIT_SIZE INCREMENT :
   这是在C语言中定义常量的一种方式。 #define  关键字后面跟着常量名称和值,这样在代码中使用这些常量时就不必记住具体的值,而只需要记住名称。这在修改代码时非常方便。比如说你需要修改增量的值,只需要修改  #define  语句就可以了,而不需要去修改代码的其他部分。
   在这个例子中, INCREMENT  的值被定义为 10, INIT_SIZE  的值被定义为  INCREMENT ,所以  INIT_SIZE  的值也是 10。

3. 关于  char *reverse_str(char *str)  函数:
   这个函数的功能是反转一个字符串。它接收一个字符串作为参数,然后将这个字符串反转,最后返回反转后的字符串。在这个函数中, *start  用来保存原始字符串的起始位置,这样在反转字符串后还能找到字符串的起始位置。

4. 关于  char *get_str(void)  函数:
   这个函数的功能是接收用户输入的一个字符串,然后返回这个字符串。在这个函数中,使用了动态内存分配,当输入的字符串超过当前分配的内存时,就会重新分配内存。这样做的好处是,不管用户输入的字符串有多长,都能正确地接收。

以上都是基于你的代码中的一些小错误进行的解释。你的代码中存在一些错误,例如变量名的混淆(如  num ),应该使用  str  和  last 。以下是修正过的代码:
#include <stdio.h>
#include <stdlib.h>

#define INCREMENT 10
#define INIT_SIZE INCREMENT

char *get_str(void)
{
    char ch;
    char *str;
    char *last;
    int limit = 0;
    long times = 1;

    str = (char *)malloc(INIT_SIZE);
    if (str == NULL)
    {
            exit(1);
    }

    last = str;

    printf("请输入一个字符串:");

    while ((ch=getchar()) != '\n')
    {
            last[limit++] = ch;
            if (limit >= INCREMENT)
            {
                    int offset = last - str;
                    str = (char *)realloc(str, INIT_SIZE + INCREMENT * times++);
                    last = str;
                    last += offset;
                    limit = 0;
            }
    }
    last[limit] = '\0';

    return str;
}

char *reverse_str(char *str)
{
    char *start = str;
    char *left = str;
    char ch;

   if (str != NULL)
    {
            while (*str++)
                    ;
            str -= 2;

            while (left < str)
            {
                    ch = *left;
                    *left++ = *str;
                    *str-- = ch;
            }
    }

    return start;
}

int main(void)
{
    char *str;

    str = get_str();
    str = reverse_str(str);
    printf("前后翻转后的结果:%s\n", str);

    free(str);

    return 0;
}

在上面的代码中,我也添加了一个  free(str)  语句,用于释放在  get_str()  函数中分配的内存。这是一个好的编程实践,因为它可以防止内存泄漏。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-12 22:24:40 | 显示全部楼层

回帖奖励 +10 鱼币

占楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-12 22:27:14 | 显示全部楼层
这个程序实现了一个通过命令行输入字符串并且翻转它前后顺序的功能。下面是这段程序的解释和注释。

`#define INCREMENT 10` 和 `#define INIT_SIZE INCREMENT` 分别定义了两个常量,用于控制当增长内存时每次申请的额外大小和初始分配的大小。

`char *get_str(void)` 定义了一个函数来获取用户从命令行中输入的字符串,该函数首先尝试将字符串初始化到一个给定的大小 `INIT_SIZE`,如果所需的空间比此目标还大,则根据 '`INCREMENT`' 再增加一些空间。然后当从命令行读取字符时,该函数会尝试将其追加到字符串中,并在需要的情况下重新为字符串分配更多空间。最后返回一个 `char *` 类型的指针,该指针指向包含所有从终端读取的数据的字符串。

`char *reverse_str(char *str)` 函数接受一个 `char *` 类型作为参数字符,该字符被认为是包含一组字符的字符串,要求显示其对应的数字,包括整数部分和小数点后两位(四舍五入)。该函数会返回一个 `char *` 类型的指针,指向倒置后的字符串。

`main()` 是程序运行开始的地方。在此,我们首先调用 `get_str()` 函数以获取用户输入的字符串,然后将其传递到 reverse_str 函数来倒置该字符串,最后我们输出结果字符串。

值得注意的是 `main()` 不仅调用了 `get_str()` 和 `reverse_str()` 函数,而且还分配了一个 `char *` 类型的指针(即 str),并将其设置为从 `get_str()` 返回的字符串。这是因为 `get_str()` 函数需要在堆上动态分配足够的空间来存储用户输入的字符串,而 `main()` 函数需要在使用完毕后释放这些内存,避免内存泄漏。

另外,我们可以注意到代码中使用了指针来传递参数和返回值。这种方式可以避免复制大量数据并浪费空间,同时也可以提高程序的效率。但是它也增加了一些难易度和调试问题,需要谨慎处理。

最后,可能需要注意代码中对字符串末尾字符 '\0' 的处理。该字符用于表示字符串的结束,并且在分配内存时应该记得将其考虑在内,但在翻转字符串时,需要注意去除该字符的影响,以免出现错误的结果。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-12 22:28:12 | 显示全部楼层    本楼为最佳答案   
这个代码的主要功能是接收用户输入的一个字符串,然后将这个字符串反转,最后打印出反转后的字符串。我会逐一回答你的问题。

1. 关于  char *get_str(void)  函数的返回值:
   这个函数的返回值是一个字符串(字符指针),它接收用户输入的字符串并返回。所以它的返回值类型是  char * 。

2. 关于  #define INCREMENT 10  和  #define INIT_SIZE INCREMENT :
   这是在C语言中定义常量的一种方式。 #define  关键字后面跟着常量名称和值,这样在代码中使用这些常量时就不必记住具体的值,而只需要记住名称。这在修改代码时非常方便。比如说你需要修改增量的值,只需要修改  #define  语句就可以了,而不需要去修改代码的其他部分。
   在这个例子中, INCREMENT  的值被定义为 10, INIT_SIZE  的值被定义为  INCREMENT ,所以  INIT_SIZE  的值也是 10。

3. 关于  char *reverse_str(char *str)  函数:
   这个函数的功能是反转一个字符串。它接收一个字符串作为参数,然后将这个字符串反转,最后返回反转后的字符串。在这个函数中, *start  用来保存原始字符串的起始位置,这样在反转字符串后还能找到字符串的起始位置。

4. 关于  char *get_str(void)  函数:
   这个函数的功能是接收用户输入的一个字符串,然后返回这个字符串。在这个函数中,使用了动态内存分配,当输入的字符串超过当前分配的内存时,就会重新分配内存。这样做的好处是,不管用户输入的字符串有多长,都能正确地接收。

以上都是基于你的代码中的一些小错误进行的解释。你的代码中存在一些错误,例如变量名的混淆(如  num ),应该使用  str  和  last 。以下是修正过的代码:
#include <stdio.h>
#include <stdlib.h>

#define INCREMENT 10
#define INIT_SIZE INCREMENT

char *get_str(void)
{
    char ch;
    char *str;
    char *last;
    int limit = 0;
    long times = 1;

    str = (char *)malloc(INIT_SIZE);
    if (str == NULL)
    {
            exit(1);
    }

    last = str;

    printf("请输入一个字符串:");

    while ((ch=getchar()) != '\n')
    {
            last[limit++] = ch;
            if (limit >= INCREMENT)
            {
                    int offset = last - str;
                    str = (char *)realloc(str, INIT_SIZE + INCREMENT * times++);
                    last = str;
                    last += offset;
                    limit = 0;
            }
    }
    last[limit] = '\0';

    return str;
}

char *reverse_str(char *str)
{
    char *start = str;
    char *left = str;
    char ch;

   if (str != NULL)
    {
            while (*str++)
                    ;
            str -= 2;

            while (left < str)
            {
                    ch = *left;
                    *left++ = *str;
                    *str-- = ch;
            }
    }

    return start;
}

int main(void)
{
    char *str;

    str = get_str();
    str = reverse_str(str);
    printf("前后翻转后的结果:%s\n", str);

    free(str);

    return 0;
}

在上面的代码中,我也添加了一个  free(str)  语句,用于释放在  get_str()  函数中分配的内存。这是一个好的编程实践,因为它可以防止内存泄漏。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-12 22:57:39 | 显示全部楼层
这段代码主要实现了以下功能:
定义了两个宏,INCREMENT表示每次重新分配内存增加的大小,INIT_SIZE表示初始字符串的大小。
编写了一个函数get_str(),用于获取用户输入的字符串,并且可以自动增加内存空间以适应用户输入的字符串长度。
编写了一个函数reverse_str(),用于将传入的字符串前后翻转。
在main函数中,调用get_str()获取用户输入的字符串,并传入reverse_str()函数进行翻转,最后输出翻转后的字符串。
对于具体问题的回答:
这个reverse_str(char *str)函数的功能是将传入的字符串前后翻转,即将字符串最后一个字符移到第一个位置,依次类推,直到将字符串完全翻转。返回值是翻转后的字符串首地址。
char *get_str(void)函数的返回值是指向获取的字符串的首地址。它需要动态分配内存空间,因为用户输入的字符串长度是不确定的,为了确保程序正常运行,需要在获取字符串前先分配一定大小的内存空间,然后根据用户输入的字符串长度来动态扩展内存空间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 01:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表