使用以下原型编写函数GetDate:void GetDate(char * date,int * dp,int * mp,int * yp);
函数接受字符串参数和显示日期的日期,如下所示:dd - mmm - yy
标记日期的两位数字,用两位数标记月份和年份的三字母快捷方式 . 该功能是分离组件并通过引用数字格式来传递它们 . 运行调用函数的程序的示例输入日期为
dd-mmm-yy:
28-Aug-63
Day = 28
Month = 8
Year = 63
我制作的代码不起作用的是:
#include <stdio.h>
#include <string.h>
#pragma warning (disable:4996)
void GetDate(char *date, int *dp, int *mp, int *yp);
void main()
{
char date[9];
int dp, mp, yp;
printf("Enter a date as dd-mmm-yy:");
GetDate(date, &dp, &mp, &yp);
printf("day=%d\n", dp);
printf("Month=%s\n", &mp);
printf("Year=%d\n",yp);
}
void GetDate(char *date, int *dp, int *mp, int *yp)
{
char *mon[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
char date[9];
int i,dp, yp,size=sizeof(mon)/sizeof(mon[0]);
for (i = 0; i < size; i++)
{
mon[i]=i+1
}
gets(date);
sscanf(date, "%d-%s-%d", &dp, mp, &yp);
}
2 回答
sscanf将指针作为参数从字符串接收数据,因为dp和dy已经是指针,所以不应该用其他符号提取地址 .
第二个,你将日期作为参数传递,然后用本地“日期”变量覆盖它 . 你不应该在函数内声明另一个日期 .
另外,sscanf是一个非常安全的函数,尝试在使用自己的验证函数将字符串传递给sscanf之前验证字符串
最后,我没有得到你的循环在函数内部做的事情,但你有一个指向字符的指针数组 . 你尝试将一些整数分配为值,也是有效的内存地址,也不是有效的字符串
代码存在以下关键问题:
char date[9]
太小了 . 不要试图严格限制用户输入 . 让我们使用预期大小的两倍:char date[2*(9+1)]
而不是
gets(date)
- 已经过时,请使用fgets()
.不要只使用
"%s"
进行扫描,因为mp
将"Aug-63"而不是"Aug"
的希望 . 使用"%3s"
返回状态表示成功/失败 .