如何一次一个数字地使用scanf()扫描整数?

2 c scanf

我想以mm/dd的形式扫描日期,所以我写了这段代码:

#include <stdio.h>

int main (void)
{
  int start_date[4];

  scanf("%d%d/%d%d", &start_date[0], &start_date[1], &start_date[2], &start_date[3]);

  printf("%d%d%d%d\n", start_date[0], start_date[1], start_date[2], start_date[3]);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是当我输入以下内容时:

04/20
Run Code Online (Sandbox Code Playgroud)

scanf() 读这个

4-419644000
Run Code Online (Sandbox Code Playgroud)

如何制作它,以便当我打印出每个元素时start_date,我得到这个:

0420
Run Code Online (Sandbox Code Playgroud)

当我输入之前的输入?

Jon*_*ler 5

一次读一位数

用途%1d:

int n = scanf("%1d%1d/%1d%1d", &start_date[0], &start_date[1], &start_date[2], &start_date[3]);
if (n != 4) { …handle error… }
Run Code Online (Sandbox Code Playgroud)

请注意,这将同时接受:

19/96
Run Code Online (Sandbox Code Playgroud)

1 9/
9

6
Run Code Online (Sandbox Code Playgroud)

作为有效的输入.如果你需要数字是连续的,你必须更加努力.通常,通常最好用fgets()(或POSIX getline())读取一行,然后解析该行sscanf().您还可以考虑检查字符串的长度等.

什么地方出了错?

顺便说一句,你说:

但是当我输入以下内容时:

04/20
Run Code Online (Sandbox Code Playgroud)

scanf() 读这个

4-419644000

这里发生的04是第一个读取%d; 第二个%d失败,因为/与数字不匹配,所以没有任何内容写入&start_date[1](或其他两个项目),并scanf()返回1.由于您没有检查返回值,您没有意识到问题.请注意,检查应该如我所示(n != 4其中4是您希望转换的项目数).检查EOF无法正常工作; 文件上没有EOF,但转换失败.既然你打印了一个未初始化的变量,你获得的值是不确定的(行话中的'未定义的行为'); 一个较大的负数是合理的(任何其他任何值,或崩溃,或......).事实上,你有三个不确定的数字在一起,其中只有第一个是负数.避免未定义的行为; 始终检查输入操作是否成功 - 如果失败则不要使用结果.(或者,至少在使用结果失败时要非常谨慎;你需要确定你知道发生了什么.)