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

loading...


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

loading...

6回答

  • 0
    char input = "20181204193456";
    

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

    char input[] = "20181204193456";
    

    这是一个字符数组(读作:'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);
    

    没有 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);
    }
    

  • 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);
    }
    

  • 1

    您不能将字符串文字分配给类似的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;
    }
    

  • 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 isn 't declared, you' ll首先需要声明它 . 工作代码如下:

    #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);
    }
    

  • 0

    您正在定义char而不是字符串 . 所以尝试:

    char input[20] = "20181204193456";
    

  • 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;
    }
    
评论

暂时没有评论!