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

C语言无字符串函数转日期格式(DD/MM/YYYY→DD-MM-YYYY)遇意外输出

解决DD/MM/YYYY转DD-MM-YYYY的C程序错误

你的程序出现意外结果的核心问题是数组越界访问,另外还有两处小问题需要修正,具体分析和修复如下:

核心错误:越界赋值字符串终止符

你的结构体定义中:

typedef struct {
    char day[3];   // 下标范围为 0、1、2
    char month[3]; // 下标范围为 0、1、2
    char year[5];  // 下标范围为 0、1、2、3、4
} date;

但初始化时你写了:

DATE.day[3] = '\0';
DATE.month[3] = '\0';
DATE.year[5] = '\0';

数组下标从0开始,day[3]已经超出了char day[3]的内存范围,属于非法内存访问,会导致程序行为异常(比如内存污染、输出乱码)。正确的做法是给每个数组的最后一个有效位置赋值终止符:

DATE.day[2] = '\0';
DATE.month[2] = '\0';
DATE.year[4] = '\0';

其他两处小问题

  1. scanf参数错误:input是数组名,本身代表数组首地址,不需要加&,应改为:
    scanf("%s", input);
    
  2. 初始打印未初始化的数组:程序开头的printf("%s\n", DATE.day);会输出乱码,因为此时DATE.day的前两个元素是未初始化的随机值,建议删除该行或者移到赋值完成后。

修正后的完整代码

#include <stdio.h>

typedef struct {
    char day[3];
    char month[3];
    char year[5];
} date;

int main(){
    char input[11];
    date DATE ;
    // 正确设置字符串终止符,避免越界
    DATE.day[2] = '\0';
    DATE.month[2] = '\0';
    DATE.year[4] = '\0';  

    int i = 0;

    // 输入日期
    printf("enter date in the format DD/MM/YYYY\n");
    scanf("%s", input);
    
    // 填充日
    for (int j = 0; j<2; j++){
        DATE.day[j] = input[i];
        i++;
    }
    i++; // 跳过斜杠

    // 填充月
    for (int j = 0; j<2; j++){
        DATE.month[j] = input[i];
        i++;
    }
    i++; // 跳过斜杠

    // 填充年
    for (int j = 0; j<4; j++){
        DATE.year[j] = input[i];
        i++;
    }

    printf("%s-%s-%s\n", DATE.day, DATE.month, DATE.year);
    
    return 0;
}

内容的提问来源于stack exchange,提问作者oumaima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:35:28