马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
}
这个代码的主要功能是接收用户输入的一个字符串,然后将这个字符串反转,最后打印出反转后的字符串。我会逐一回答你的问题。
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() 函数中分配的内存。这是一个好的编程实践,因为它可以防止内存泄漏。
|