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';
其他两处小问题
- scanf参数错误:
input是数组名,本身代表数组首地址,不需要加&,应改为:scanf("%s", input); - 初始打印未初始化的数组:程序开头的
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
相关产品推荐
相关产品推荐

