未知字符串最大长度时实现打印、字符统计及逆序输出的相关问题
C语言单词字符统计及逆序输出实现方案
核心问题解决思路
- 首先禁止使用
gets()函数:该函数已在C11标准中被移除,存在严重的缓冲区溢出漏洞,推荐用fgets()或getline()替代。 - 未知输入长度的数组声明有两种可行方案:
- 固定长度数组:常规单词长度远小于1KB,直接声明
char input[1024]即可覆盖绝大多数场景,实现成本最低。 - 动态内存分配:如果需要严格匹配输入长度,可通过动态申请堆内存实现,无需提前指定数组长度。
- 固定长度数组:常规单词长度远小于1KB,直接声明
完整代码实现
1. 固定长度数组方案(推荐普通场景使用)
#include <stdio.h> // 统计字符数:排除fgets读取的末尾换行符 int count_chars(char *str) { int count = 0; while (str[count] != '\0' && str[count] != '\n') { count++; } return count; } // 逆序输出字符串 void reverse_print(char *str, int len) { for (int i = len - 1; i >= 0; i--) { putchar(str[i]); } putchar('\n'); } int main() { char input[1024]; printf("请输入单词:"); fgets(input, sizeof(input), stdin); int char_num = count_chars(input); printf("字符数量:%d\n", char_num); printf("逆序输出结果:"); reverse_print(input, char_num); return 0; }
2. 动态内存分配方案(适配任意长度输入)
#include <stdio.h> #include <stdlib.h> int main() { char *input = NULL; size_t buf_size = 0; // getline会自动申请匹配输入长度的内存,返回值包含末尾换行符 ssize_t char_num = getline(&input, &buf_size, stdin) - 1; printf("字符数量:%zd\n", char_num); printf("逆序输出结果:"); for (ssize_t i = char_num - 1; i >= 0; i--) { putchar(input[i]); } putchar('\n'); free(input); // 必须释放动态申请的内存,避免内存泄漏 return 0; }
char变量定义说明
- 统计和逆序函数中不需要声明固定长度的char数组,直接定义
char *str指针作为参数即可,传入数组名时数组会自动退化为首元素指针,可正常访问所有字符。 - 如果用动态分配方案,主函数中初始声明
char *input = NULL即可,getline()会自动完成内存申请操作。
内容的提问来源于stack exchange,提问作者Mary Jenkins
相关产品推荐
相关产品推荐

