我写了一些小巧的代码,从我的角度来看,它的行为非常奇怪。
因此该程序读取date和2015-11-30Mo。然后,我需要通过与值数组进行比较来获取星期几。这是代码:

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


但是,即使使用“ char wdays [2];”,dt.d也会读取错误。

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

最佳答案

进行以下更改:


由于wday字符串需要存储3个字节,因此请使用char wday[3];
scanf-将%2s更改为wday
最后使用printf-使用%s(可选)


这是代码:

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

关于c - scanf读取3个数字和1个字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34059698/

10-13 02:37