【问题标题】:scanf reading 3 numbers and 1 stringscanf 读取 3 个数字和 1 个字符串
【发布时间】:2015-12-03 07:00:58
【问题描述】:

我写了一小段代码,从我的角度来看,它的行为很奇怪。 所以程序读取日期和 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);

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

所以我觉得我错过了有关 scanf 或 char 数组的一些内容。你能帮我找出来吗?

【问题讨论】:

  • 检查答案。让我知道结果

标签: c arrays scanf


【解决方案1】:

使用字符串%s 转换字符读取wday,而不是%c

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

【讨论】:

    【解决方案2】:

    进行以下更改:

    1. 由于wday字符串需要存储3个字节,所以使用char wday[3];
    2. scanf - 将wday 更改为%2s
    3. 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;
    }
    

    【讨论】:

    • 谢谢,帮了大忙!但是你能解释一下为什么我存储 3 个字节吗?我存储“Mo”,它是 2 个字符,每个字符一个字节,或者我遗漏了什么?
    • 两个字符 = 两个字节,加上 null character '\0' 所以总共需要 3 个字节 @ВикторияМартьянова
    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多