scanf读取3个数字和1个字符串

时间:2015-12-03 07:00:58

标签: c arrays scanf

我写了一小段代码,从我的角度来看,它表现得非常奇怪。 所以该程序读取日期和2015-11-30 Mo.然后我需要通过与值数组进行比较来获取星期几。这是代码:

#include <stdio.h>
#include <stdio.h>
#include <string.h>

typedef struct Date
{
    int d, m, y;
} date;

int main(void) {

    char wdays[][7] = {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"};
    date dt;
    char wday[2];
    printf("Input date and day of week.\nFor example: 2015-11-30 Mo\n");
    scanf("%d-%d-%d %2c\n", &dt.y, &dt.m, &dt.d, wday);
    printf("%d-%d-%d %s\n", dt.y, dt.m, dt.d, wday);
    if (strcmp(wdays[0], wday) == 0) printf("Compare Ok");
    printf("%d\n", wday[2]);

    return 0;
}

问题是wday [2]不是空的,与wdays的值相比失败(我输入2015-11-30 Mo)。你能解释一下,为什么它不是空的?我声明它是2个字符长度,我使用scanf读取2个字符。

其他问题: 1)如果我把“char wday [1];”而不是“char wday [2];”然后wday只包含2个字符,但dt.d读错了,我收到111(这是字母“o”的代码)而不是30。

2)我也试着像这样阅读

scanf("%d-%d-%d %s\n", &dt.y, &dt.m, &dt.d, wday);

但是dt.d也读错了,即使是“char wdays [2];”

所以我觉得我缺少一些关于scanf或char数组的东西。你能帮我找一下吗?

2 个答案:

答案 0 :(得分:1)

使用字符串wday转换字符而不是%s来阅读%c

scanf("%d-%d-%d %2s\n", &dt.y, &dt.m, &dt.d, wday);

答案 1 :(得分:0)

进行以下更改:

  1. 由于wday字符串需要存储3个字节,请使用char wday[3];
  2. scanf - %2s更改为wday
  3. 最后
  4. printf - 使用%s(可选)
  5. 以下是代码:

    #include <stdio.h>
    #include <stdio.h>
    #include <string.h>
    
    typedef struct Date
    {
        int d, m, y;
    } date;
    
    int main(void) {
    
        char wdays[][7] = {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"};
        date dt;
        char wday[3];
        printf("Input date and day of week.\nFor example: 2015-11-30 Mo\n");
        scanf("%d-%d-%d %2s\n", &dt.y, &dt.m, &dt.d, wday);
        printf("%d-%d-%d %2s\n", dt.y, dt.m, dt.d, wday);
        if (strcmp(wdays[0], wday) == 0) printf("Compare Ok\n");
        printf("%s\n", wday);
    
        return 0;
    }