【问题标题】:Convert Array of Dates into Integers将日期数组转换为整数
【发布时间】:2014-08-14 21:45:35
【问题描述】:

我正在使用 C 编程语言。我目前有一个二维字符数组,格式为 “2010-05-01”。我想将每个数字转换为整数数据类型,然后将它们存储在整数数组中。这样做的原因是因为我需要一个整数的一维数组,然后我可以使用指针通过引用将其传递给函数。

请在下面查看我当前的代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

int main()
{
    float values[] = { //Contains 100 float literals }
    int i, j, size = sizeof(values)/sizeof(*values);
    char strings[][10] = {"2010-05-01", "2010-10-01" //Contains a total of 100 dates}
    int dates[size * 3];

    for (i = 0, j = 0; j < size; ++i, ++j) {
        dates[i] = atoi(strtok(strings[j], "-"));
        dates[++i] = atoi(strtok(NULL, "-"));
        dates[++i] = atoi(strtok(NULL, "-"));
    }

    for (i = 0; i < size; ++i)
        printf("%d\n", dates[i]);
    return 0;
}

此代码当前返回总线错误,我不明白为什么。我是一个相对初学者,如果我做了一些愚蠢的事情,很抱歉。任何 cmets 将不胜感激,并感谢您的宝贵时间。

【问题讨论】:

  • 您很可能正在将NULL 传递给atoi()。我建议使用一些更简单的示例来玩弄strtok()
  • 当你在循环中增加 i 时,你应该将你的条件更改为 size-2 之类的东西
  • 您应该提供一个工作代码,比如说 2 个文字/日期,而不是 100 个缺失。用一个简短的例子来调试它也比一个完整的例子更好。
  • @daouzli 对不起,我应该是一个 j。因此,我编辑了我的问题。是的,这是有道理的,我会尝试一些更简单的版本并发布任何更新。感谢您的帮助
  • 对于从字符串日期到数字日期(自纪元以来的秒数)的快速简单转换,您可以使用 strtotime()

标签: c arrays pointers char type-conversion


【解决方案1】:

char strings[][10] 应为 char strings[][11] 以考虑尾随空字符。

您似乎将每个日期解析为 dates 数组中的三个条目——这是故意的吗?

【讨论】:

  • 哦,是的,忘记了 NULL 字符,我会看看,谢谢。我在做什么?我的意思是将每个日期的年份放入一个索引中,然后是月份,最后是日期。我每次都添加整个日期吗?
  • 不,如果您想将每个日期放入dates 数组中的三个条目中,分别是年、月和日,您的代码应该使用声明为[11]strings 数组跨度>
【解决方案2】:

要独立提取年、日和月并将它们放在同一个数组中,您可以将年放在一起,然后是月份,然后是日期(假设日期格式为yyyy-mm-dd)。这样的数组可以存储如下序列:

y1, y2, y3, m1, m2, m3, d1, d2, d3

下面的代码在数组ymd中做这种事情

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 2

int main()
{
    int i;
    char strings[SIZE][11] = {"2010-05-01", "2010-10-01" };
    int ymd[SIZE*3];

    for (i = 0; i < SIZE; i++) {
        ymd[i*3] = atoi(strtok(strings[i], "-"));
        ymd[i*3+1] = atoi(strtok(NULL, "-"));
        ymd[i*3+2] = atoi(strtok(NULL, "-"));
    }

    for (i = 0; i < SIZE; i++)
        printf("%d/%d/%d\n", ymd[i*3], ymd[i*3+1], ymd[i*3+2]);
    return 0;
}

输出将是:

2010/5/1
2010/10/1

【讨论】:

  • 非常感谢,这行得通。我不知道我做错了什么,所以我想问题是我过于复杂了,例如,使用一个数组而不是做简单的事情并将它们分开。很好的答案,再次感谢
猜你喜欢
  • 2016-08-13
  • 2020-11-26
  • 2021-08-17
  • 2018-10-16
  • 2022-07-07
  • 1970-01-01
  • 2020-06-27
相关资源
最近更新 更多