首页 文章

如何在c编程日期函数中分隔日期[关闭]

提问于
浏览
-2

使用以下原型编写函数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 回答

  • 1

    sscanf将指针作为参数从字符串接收数据,因为dp和dy已经是指针,所以不应该用其他符号提取地址 .

    第二个,你将日期作为参数传递,然后用本地“日期”变量覆盖它 . 你不应该在函数内声明另一个日期 .

    另外,sscanf是一个非常安全的函数,尝试在使用自己的验证函数将字符串传递给sscanf之前验证字符串

    最后,我没有得到你的循环在函数内部做的事情,但你有一个指向字符的指针数组 . 你尝试将一些整数分配为值,也是有效的内存地址,也不是有效的字符串

  • 1

    代码存在以下关键问题:

    char date[9];
    ...
    gets(date);
    sscanf(date, "%d-%s-%d", &dp, mp, &yp);
    

    char date[9] 太小了 . 不要试图严格限制用户输入 . 让我们使用预期大小的两倍: char date[2*(9+1)]

    而不是 gets(date) - 已经过时,请使用 fgets() .

    不要只使用 "%s" 进行扫描,因为 mp 将"Aug-63"而不是 "Aug" 的希望 . 使用 "%3s"

    返回状态表示成功/失败 .

    int GetDate(char *date, size_t size, int *dp, int *mp, int *yp) {
      static const char *mon[] = { 
          "Jan", "Feb", "Mar", "Apr", "May", "Jun", 
          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
    
      int i;
      int monsize = sizeof(mon)/sizeof(mon[0]);
      char input_mon[3+1];
    
      if (fgets(date, size, stdin) == NULL) {
        return 1; // fail: EOF or IO error
      }
      if (3 != sscanf(date, "%d -%3s -%d", &dp, input_mon, &yp)) {
        return 1; // fail: input not formatted properly
      }
      for (i = 0; i < monsize; i++) {
        if (strcmp(input_mon, mon[i]) == 0) {
          *mp = i + 1;
          break;
        } 
      }
      if (i == monsize) {
        return 1; // fail: No such month
      }
      return 0;
    }
    
    void main(void) {
      char date[2*10];
      ...
      if (GetDate(date, sizeof date, &dp, &mp, &yp)) {
        puts("failed");
        return 1;
      }
    }
    

相关问题