这是代码,但是我遇到了错误,实时参数太少,并且在char之前需要预期的表达式。
我正在尝试编写一种方法,然后通过该方法传递信息(输入)并获取值(输出)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
char realtime(char input[20], char output[25]){
//char input[20];
//char output [25];
char year[5];
char month[3];
char day[3];
char hour[3];
char min[3];
char sec[3];
strncpy(year, input, 4);
year[4] = '\0';
strncpy(month, input + 4, 2);
month[2] = '\0';
strncpy(day, input + 6, 2);
day[2] = '\0';
strncpy(hour, input + 8, 2);
hour[2] = '\0';
strncpy(min, input + 10, 2);
min[2] = '\0';
strncpy(sec, input + 12, 2);
sec[2] = '\0';
sprintf(output, "%s-%s-%sT%s:%s:%s", year, month, day, hour, min, sec);
return 0;
}
int main(){
char input = "20181204193456";
realtime( char input[20], char output[25]);
printf("Parsed Date %s", output);
}
答案 0 :(得分:1)
char input = "20181204193456";
无效。这是一个单个字符输入,它使用指向字符串文字"20181204193456"
的指针的内容初始化。这不是您想要的。您想要:
char input[] = "20181204193456";
这是一个字符数组(读作:“字符串”),由字符串文字"20181204193456"
的内容初始化而成。数组的长度在末尾包含终止符,但是没有指定大小[]
,我们将其保留为编译器自动检测到的大小。
realtime(char input[20], char output[25]);
这是错误且无效的。您想要:
char outout[25];
realtime(input, output);
首先,您要保留25个字符的输出空间以写入任何内容。然后,您要运行该函数,第一个输入参数,第二个输出参数。
修复此类错误后,您将大有裨益。
但是:
sprintf(output, "%s-%s-%sT%s:%s:%s", year, month, day, hour, min, sec);
可以,但是最好使用snprintf
:
snprintf(output, 25, "%s-%s-%sT%s:%s:%s", year, month, day, hour, min, sec);
如果没有25
和snprintf
,而长度意外地变长,则会导致写入超出数组大小。在这里看起来似乎很多余,但是最好在任何地方使用它。
strncpy(arr, ..., len - 1)
arr[len] = '\0'
sprintf(... "%s", arr);
可以。但是您可以:
strlcpy(arr, ..., len)
sprintf(... "%s", arr);
甚至更好:
sprintf(... "%.*s", len, arr);
所以整个功能就是:
char realtime(char input[20], char output[25]){
snprintf(output, 25, "%.4s-%.2s-%.2sT%.2s:%.2s:%.2s",
input, input + 4, input + 6,
input + 8, input + 10, input + 12);
}
答案 1 :(得分:1)
您需要在main中定义一个变量来保存输出,并且定义和实时调用不正确。也许这样会更好:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char realtime(char *input, char *output){
//char input[20];
//char output [25];
char year[5];
char month[3];
char day[3];
char hour[3];
char min[3];
char sec[3];
strncpy(year, input, 4);
year[4] = '\0';
strncpy(month, input + 4, 2);
month[2] = '\0';
strncpy(day, input + 6, 2);
day[2] = '\0';
strncpy(hour, input + 8, 2);
hour[2] = '\0';
strncpy(min, input + 10, 2);
min[2] = '\0';
strncpy(sec, input + 12, 2);
sec[2] = '\0';
sprintf(output, "%s-%s-%sT%s:%s:%s", year, month, day, hour, min, sec);
return 0;
}
int main(){
char input[] = "20181204193456";
char output[25];
realtime(input, output);
printf("Parsed Date %s", output);
return 0;
}
答案 2 :(得分:0)
您正在定义一个字符而不是一个字符串。 因此,尝试:
char input[20] = "20181204193456";
答案 3 :(得分:0)
您不能像这样将字符串文字分配给char数组。代替这个:
char input = "20181204193456";
您必须这样做:
char input[20];
strcpy(input, "20181204193456");
此外,这里的电话是
realtime( char input[20], char output[25]);
仅仅是功能签名的副本。而是这样做:
realtime(input, output);
您还需要预先定义output
。总而言之,您的main
函数应如下所示:
int main() {
char input[20];
strcpy(input, "20181204193456");
char output[20];
realtime(input, output);
printf("Parsed Date %s", output);
// depending on the system, maybe wait for user input or pause here so the window doesn't immediately close
return 0;
}
还要注意添加的return 0;
表示程序成功执行。
当然,也可以通过直接将字符串文字传递给函数来完全不用input
来完成:
int main() {
char output[20];
realtime("20181204193456", output);
printf("Parsed Date %s", output);
return 0;
}
答案 4 :(得分:0)
全局声明数组input
和output
,以便可以在方法(或)函数中使用它。像这样的东西
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
char realtime(char input[20], char output[25]){
//char input[20];
//char output [25];
char year[5];
char month[3];
char day[3];
char hour[3];
char min[3];
char sec[3];
strncpy(year, input, 4);
year[4] = '\0';
strncpy(month, input + 4, 2);
month[2] = '\0';
strncpy(day, input + 6, 2);
day[2] = '\0';
strncpy(hour, input + 8, 2);
hour[2] = '\0';
strncpy(min, input + 10, 2);
min[2] = '\0';
strncpy(sec, input + 12, 2);
sec[2] = '\0';
sprintf(output, "%s-%s-%sT%s:%s:%s", year, month, day, hour, min, sec);
return 0;
}
int main(){
//char input = "20181204193456";
char input[20] = "20181204193456";
char output[20];
realtime( input, output);
printf("Parsed Date %s", output);
}
答案 5 :(得分:0)
首先,在您的main
函数中,声明并初始化:
char input = "20181204193456";
在C中,char是1字节类型。 C中的字符串由字符数组表示。因此,您需要:
char input[15] = "20181204193456";
尽管字符串中只有14个字符,但您需要15个字符,因为在C中,每个字符串都将以0
字节结尾。在这种情况下,这是自动完成的。另一种方法是:
char input[] = "20181204193456"
在这种情况下,编译器将确定所需的空间。
接下来,您的函数调用不正确:
realtime( char input[20], char output[25]);
在调用函数时,应仅使用参数名称,而不是其类型,例如:
realtime(input, output);
鉴于未声明output
,您首先需要声明它。工作代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
char realtime(char input[20], char output[25])
{
char year[5];
char month[3];
char day[3];
char hour[3];
char min[3];
char sec[3];
strncpy(year, input, 4);
year[4] = '\0';
strncpy(month, input + 4, 2);
month[2] = '\0';
strncpy(day, input + 6, 2);
day[2] = '\0';
strncpy(hour, input + 8, 2);
hour[2] = '\0';
strncpy(min, input + 10, 2);
min[2] = '\0';
strncpy(sec, input + 12, 2);
sec[2] = '\0';
sprintf(output, "%s-%s-%sT%s:%s:%s", year, month, day, hour, min, sec);
return 0;
}
int main()
{
char input[15] = "20181204193456";
char output[25];
realtime(input, output);
printf("Parsed Date %s", output);
}