从C中的日期中提取数字

时间:2017-12-07 02:26:21

标签: c string char

我有一个从日期转换数字的作业。

我们将日期作为字符串,例如18.2.2014,我需要提取整数18,2,2014。

我的方式并不完美...

您认为最好的方式是什么?

void luckChoice(char a[]){

    int month=10*(a[3]-'0')+(a[4]-'0');
    int day=(a[0]-'0')*10+(a[1]-'0');
    int year=(a[9]-'0')+(a[8]-'0')*10+(a[7]-'0')*100+(a[6]-'0')*1000;

2 个答案:

答案 0 :(得分:1)

我不知道你是否对它好,但你可以直接在scanf()本身做到这一点。

只需输入

即可
if (scanf("%d.%d.%d", &dd, &mm, &yy) == 3) { …OK… } else { …failed… }

这会忽略'。'来自指定顺序的输入。

否则你可以使用sscanf()函数,如下所示:

void luckChoice(char a[]){
     int dd,mm,yy;
     sscanf(a,"%d.%d.%d",&dd,&mm,&yy);
}

答案 1 :(得分:0)

有很多方法可以解决这个问题。一个简单的问题是应该使用多少代码来检测无效输入?

保持C标准库,代码可以多次处理字符串并捕获许多错误。

// Expand the f() signature
// void luckChoice(char a[]){
int luckChoice(const char a[], int *year, int *month, int *day) {

检查格式。 "%n"保存扫描的偏移量,如果它到达那么远"%*2[0-9]"匹配1或2位数,但不保存结果。这与"%d"不同,'+'允许引号空格和'-' int n = 0; sscanf(a, "%*2[0-9].%*2[0-9].%*4[0-9]%n", &n);

n

如果 if (n > 0 && a[n] == '\0') { sscanf(a, "%d.%d.%d", day, mon, year); // check ranges if desired if (*day < 1 || *day > 31) return 0; if (*mon < 1 || *mon > 12) return 0; // additional checks TDB_Code(); return 1; // success } return 0; // failure } 非零,则扫描完全成功。所以,如果这是字符串的结尾,那么 - 哦,快乐的一天!

import json

param1 = "xxxxxx" 
param2 = "11111111111111" 
param3 = "333333333"

with open('data/'+param1+'.json') as json_data:
    data = json.load(json_data)
    for a in data: 
       a.remove(param2)
with open('data/'+param1+'.json','w','utf-8') as f:
     json.dump(data, f, sort_keys=True, indent=4,ensure_ascii=False)