C语言 我在这个更改日期格式的程序中不断得到意外输出

3lxsmp7m  于 2023-01-16  发布在  其他
关注(0)|答案(1)|浏览(134)

我正在尝试编写一个程序,它可以输入DD/MM/YYYY格式的日期,并将格式更改为DD-MM-YYYY,而不使用C中的字符串函数。

#include <stdio.h>


typedef struct {
    char day[3];
    char month[3];
    char year[5];
} date;

int main(){
    char input[11];
    date DATE ;
    DATE.day[3] = '\0';
    DATE.month[3] = '\0';
    DATE.year[5] = '\0';  
    printf("%s\n", DATE.day);

    int i = 0;

    // saisie de date
    printf("enter date in the format DD/MM/YYYY\n");
    scanf("%s", &input);
    
    //fill in 

    // fill in  day
    for (int j = 0; j<2; j++){
        DATE.day[j] = input[i];
        i++;
        
    }
    i++;

    // fill in  month
    for (int j = 0; j<2; j++){
        DATE.month[j] = input[i];
        i++;
    }
    i++;

    // fill in  year
    for (int j = 0; j<4; j++){
        DATE.year[j] = input[i];
        i++;
    }

    printf("%s-%s-%s", DATE.day,DATE.month,DATE.year);

    
    return 0;
}

我想这个问题与我初始化字符串的方式有关,但是它仍然不起作用。

anhgbhbe

anhgbhbe1#

我的猜测是,如果你设置了编译器警告,你就会收到警告,告诉你程序设置的数组值超出了界限。记住,对于任何一个被设置为特定大小的数组(例如“3”),数组的最大索引值是大小值减1(例如“2”)。
这样,我重构了代码,如下面的清单所示。

#include <stdio.h>

typedef struct
{
    char day[3];
    char month[3];
    char year[5];
} date;

int main()
{
    char input[11];
    date DATE ;
    DATE.day[2] = '\0';         /* Fixed the index on these arrays */
    DATE.month[2] = '\0';
    DATE.year[4] = '\0';
    printf("%s\n", DATE.day);

    int i = 0;

    // saisie de date
    printf("enter date in the format DD/MM/YYYY\n");
    scanf("%s", input);         /* Corrected the input to reference the character array pointer name - does not require the ampersand */

    //fill in

    // fill in  day
    for (int j = 0; j<2; j++)
    {
        DATE.day[j] = input[i];
        i++;
    }
    i++;

    // fill in  month
    for (int j = 0; j<2; j++)
    {
        DATE.month[j] = input[i];
        i++;
    }
    i++;

    // fill in  year
    for (int j = 0; j<4; j++)
    {
        DATE.year[j] = input[i];
        i++;
    }

    printf("%s-%s-%s", DATE.day,DATE.month,DATE.year);

    return 0;
}

注意索引值中的更正。另外,仅供参考,当使用scanf并输入字符数组(例如字符串)时,变量名不包括与号。数组的名称引用指向数组的指针。
做了这些调整之后,下面是终端的一些示例输出。

@Vera:~/C_Programs/Console/GetDate/bin/Release$ ./GetDate 

enter date in the format DD/MM/YYYY
11/04/1955
11-04-1955

尝试这些修正,看看它是否符合你的项目的精神。

相关问题