You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:18:04