-1

这是代码,但我收到错误,实时参数太少,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);
}
4

6 回答 6

1
char input = "20181204193456";

是无效的。这是一个单一的字符输入,它使用指向字符串文字的指针的内容进行初始化"20181204193456"。这不是你想要的。你要:

char input[] = "20181204193456";

这是一个用 string literal 的内容初始化的字符数组(读作:'string')"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);
}
于 2018-12-10T11:26:33.753 回答
1

您需要在 main 中定义一个变量来保存输出,并且定义和调用 realtime 是不正确的。也许这会更好:

#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;
}
于 2018-12-10T11:34:15.077 回答
0

您正在定义一个字符而不是一个字符串。所以试试:

 char input[20] = "20181204193456";
于 2018-12-10T11:21:34.943 回答
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;
}
于 2018-12-10T11:22:10.907 回答
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);
}
于 2018-12-10T11:29:53.053 回答
-1

声明数组inputoutput全局,以便您可以跨方法(或)函数使用它。像这样的东西,

#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);
}
于 2018-12-10T11:23:48.257 回答