我是C语言的新手,正在测试代码,而我正在努力使用函数

时间:2018-12-10 11:13:28

标签: c

这是代码,但是我遇到了错误,实时参数太少,并且在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);
}

6 个答案:

答案 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);

如果没有25snprintf,而长度意外地变长,则会导致写入超出数组大小。在这里看起来似乎很多余,但是最好在任何地方使用它。

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)

全局声明数组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);
}

答案 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);
}