gpt4 book ai didi

c - 如何转换日期格式: 2019-08-22 16:16:08] to the format: aammjjhhmmss in C language

转载 作者:行者123 更新时间:2023-11-30 20:08:16 24 4
gpt4 key购买 nike

我需要将此日期:2019-08-22 16:16:08 转换为以下特定形式:aammjjhhmmss(aa 表示“année”或年份;jj 表示“jour”或“day”)。

我正在使用 C 语言。这是我的代码。我觉得它不好,因为我需要调用该函数三次才能得到我想要的:

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

void removeChar(char *s, int c){

int j;
int n = strlen(s);
for (int i=j=0; i<n; i++)
if (s[i] != c)
s[j++] = s[i];

s[j] = '\0';
}

int main()
{
char s[] = "2019-08-22 16:16:08";
removeChar(s, '-');
printf("test 1 without '-' %s \n",s);
removeChar(s, ':');
printf("test 2 without ':' %s \n",s);
removeChar(s, ' ');
printf("test 3 without ' ' %s \n",s);
return 0;
}

结果:

test 1 without '-' 20190822 16:16:08                                                                                                        
test 2 without ':' 20190822 161608
test 3 without ' ' 20190822161608

格式为:YYMMDDHHMMSS

最佳答案

您可以将其视为日期/时间操作的练习(困难),或字符串操作的练习(更简单)。

如果您想进行日期/时间操作,那么在 POSIX 环境中,strptime()strftime()是你的 friend 。 (注意:strftime() 是标准 C;strptime() 是 POSIX 的一部分。)

您的代码将其视为字符串操作的练习。您的结果显示 YYYYMMDD(年份的 4 位数字);您的请求显示年份的 AA 或 YY(2 位数字)。我想知道哪个是正确的?如果您有 4 个输入和 4 个输出数字,那么生活会比有 4 个输入和 2 个输出更简单。假设应该是 4 位输入,4 位输出,那么您所需要做的就是复制这些数字。

您的代码中有一个微妙的错误:

int j;
int n = strlen(s);
for (int i=j=0; i<n; i++)
if (s[i] != c)
s[j++] = s[i];

s[j] = '\0';

您有两个不同的变量j,并且最后一次赋值中使用的j未初始化。如果您使用 GCC,则可以使用 -Wshadow 作为编译选项来获取有关此类变量阴影的警告。您应该使用:

int j = 0;
int n = strlen(s);
for (int i = 0; i < n; i++)
{
if (s[i] != c)
s[j++] = s[i];
}
s[j] = '\0';

但是,您有理由担心调用函数三次。您可以编写一个只需要调用一次的变体,因为它只保留输入中的数字:

#include <ctype.h>

void keepDigits(char *s)
{
int j = 0;
int n = strlen(s);
for (int i = 0; i < n; i++)
{
if (isdigit((unsigned char)s[i]))
s[j++] = s[i];
}
s[j] = '\0';
}

事实上,您还可以通过以下方式避免使用 strlen() 预扫描字符串:

void keepDigits(char *s)
{
int j = 0;
for (int i = 0; s[i] != '\0'; i++)
{
if (isdigit((unsigned char)s[i]))
s[j++] = s[i];
}
s[j] = '\0';
}

现在您扫描字符串一次而不是 6 次(3 次调用“remove”函数来扫描整个字符串,每次调用 strlen() 也会扫描整个字符串) .

测试代码:

int main(void) 
{
char s[] = "2019-08-22 16:16:08";
printf("Before: [%s]\n", s);
keepDigits(s);
printf("After: [%s]\n", s);
return 0;
}

输出:

Before: [2019-08-22 16:16:08]
After: [20190822161608]

如果您只需要 2 位数字表示年份,那么您可以使用:

int main(void) 
{
char s[] = "2019-08-22 16:16:08";
char *p = &s[2];
printf("Before: [%s]\n", p);
keepDigits(p);
printf("After: [%s]\n", p);
return 0;
}

输出:

Before: [19-08-22 16:16:08]
After: [190822161608]

但请注意,前两位数字仍位于此处的 s 中。

关于c - 如何转换日期格式: 2019-08-22 16:16:08] to the format: aammjjhhmmss in C language,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57611869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com