如何将日期格式:2019-08-22 16:16:08]转换为C语言格式:aammjjhhmmss
How to convert a date format: 2019-08-22 16:16:08] to the format: aammjjhhmmss in C language
我需要将此日期:2019-08-22 16:16:08 转换为此特定形式:aammjjhhmmss
(aa
表示 'année' 或年份;jj
'jour' 或天)。
我正在使用 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] = '[=11=]';
}
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
.
您可以将其视为 date/time 操作练习(困难),或字符串操作练习(更简单)。
如果你想做date/time操作,那么在POSIX环境下,strptime()
and strftime()
就是你的朋友。 (注意: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] = '[=10=]';
您有两个不同的变量 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] = '[=11=]';
但是,您理所当然地担心会调用您的函数三次。您可以编写一个只需要调用一次的变体,因为它只保留输入中的数字:
#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] = '[=12=]';
}
事实上,您也可以避免使用 strlen()
预扫描字符串:
void keepDigits(char *s)
{
int j = 0;
for (int i = 0; s[i] != '[=13=]'; i++)
{
if (isdigit((unsigned char)s[i]))
s[j++] = s[i];
}
s[j] = '[=13=]';
}
现在您扫描字符串一次而不是 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
这里。
我需要将此日期:2019-08-22 16:16:08 转换为此特定形式:aammjjhhmmss
(aa
表示 'année' 或年份;jj
'jour' 或天)。
我正在使用 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] = '[=11=]';
}
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
.
您可以将其视为 date/time 操作练习(困难),或字符串操作练习(更简单)。
如果你想做date/time操作,那么在POSIX环境下,strptime()
and strftime()
就是你的朋友。 (注意: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] = '[=10=]';
您有两个不同的变量 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] = '[=11=]';
但是,您理所当然地担心会调用您的函数三次。您可以编写一个只需要调用一次的变体,因为它只保留输入中的数字:
#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] = '[=12=]';
}
事实上,您也可以避免使用 strlen()
预扫描字符串:
void keepDigits(char *s)
{
int j = 0;
for (int i = 0; s[i] != '[=13=]'; i++)
{
if (isdigit((unsigned char)s[i]))
s[j++] = s[i];
}
s[j] = '[=13=]';
}
现在您扫描字符串一次而不是 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
这里。