C语言实现字符串下划线填充功能代码运行异常如何解决
C语言下划线填充函数问题修正
现有代码的核心错误
- 内存申请逻辑错误:不管输入字符串长度,最终输出固定16个有效字符加1位终止符,只需申请17字节内存即可。原代码按照输入长度申请内存,既浪费空间也无法满足截断场景的存储需求。
- 填充起始位置计算错误:
lench = 17 - len的逻辑完全错误,下划线应该从原字符串的实际长度位置开始填充,而非从17减长度的位置开始,会导致大部分需要填充的位置没有被赋值。 - 未处理超长字符串截断逻辑:输入长度超过16时没有做截断操作,直接全量拷贝原字符串不符合需求,还存在缓冲区溢出风险。
- 字符串终止符设置错误:终止符配置被注释失效,且就算开启也错误写在索引17的越界位置,正确终止符应该放在索引16的位置。
- 未处理fgets读取的换行符:fgets会把输入末尾的换行符计入字符串,导致填充长度计算错误。
- 缺少WIDTH宏定义:代码中使用的WIDTH未定义,按照需求应该定义为16。
- 内存泄漏风险:malloc申请的内存使用后未释放。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define WIDTH 16 char* padding(char* plaintext) { const char ch = '_'; size_t len = strlen(plaintext); // 固定申请17字节:16位有效字符 + 1位'\0' char *p_text = malloc(17); if (!p_text) return NULL; // 内存申请失败判空 // 先拷贝最多16个原字符 strncpy(p_text, plaintext, 16); // 长度不足16的部分填充下划线 if (len < 16) { for (size_t i = len; i < 16; i++) { p_text[i] = ch; } } // 末尾加终止符 p_text[16] = '\0'; return p_text; } int main() { while (1) { char plaintext[WIDTH + 2]; // 多留一位存换行符 printf("Enter a string: "); fgets(plaintext, WIDTH + 2, stdin); if (plaintext[0] == '\n' || plaintext[0] == '\r') break; // 去掉fgets读取到的换行符 size_t input_len = strlen(plaintext); if (input_len > 0 && plaintext[input_len - 1] == '\n') { plaintext[input_len - 1] = '\0'; } char* padded_plaintext = padding(plaintext); if (padded_plaintext) { printf("padded plaintext = %s\n", padded_plaintext); free(padded_plaintext); // 释放申请的内存 } printf("\n"); } return 0; }
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

