scanf 读取 3 个数字和 1 个字符串
scanf reading 3 numbers and 1 string
我写了一小段代码,从我的角度来看,它的行为很奇怪。
所以程序读取日期和 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 数组的信息。你能帮我找出来吗?
使用字符串 %s
转换字符读取 wday
,而不是 %c
。
scanf("%d-%d-%d %2s\n", &dt.y, &dt.m, &dt.d, wday);
进行以下更改:
- 由于
wday
字符串需要存储3个字节,所以使用char wday[3];
scanf
- wday
更改为 %2s
。
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;
}
我写了一小段代码,从我的角度来看,它的行为很奇怪。 所以程序读取日期和 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 数组的信息。你能帮我找出来吗?
使用字符串 %s
转换字符读取 wday
,而不是 %c
。
scanf("%d-%d-%d %2s\n", &dt.y, &dt.m, &dt.d, wday);
进行以下更改:
- 由于
wday
字符串需要存储3个字节,所以使用char wday[3];
scanf
-wday
更改为%2s
。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;
}