我想以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)
当我输入之前的输入?
用途%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().您还可以考虑检查字符串的长度等.
顺便说一句,你说:
但是当我输入以下内容时:
Run Code Online (Sandbox Code Playgroud)04/20
scanf()读这个4-419644000
这里发生的04是第一个读取%d; 第二个%d失败,因为/与数字不匹配,所以没有任何内容写入&start_date[1](或其他两个项目),并scanf()返回1.由于您没有检查返回值,您没有意识到问题.请注意,检查应该如我所示(n != 4其中4是您希望转换的项目数).检查EOF无法正常工作; 文件上没有EOF,但转换失败.既然你打印了一个未初始化的变量,你获得的值是不确定的(行话中的'未定义的行为'); 一个较大的负数是合理的(任何其他任何值,或崩溃,或......).事实上,你有三个不确定的数字在一起,其中只有第一个是负数.避免未定义的行为; 始终检查输入操作是否成功 - 如果失败则不要使用结果.(或者,至少在使用结果失败时要非常谨慎;你需要确定你知道发生了什么.)
| 归档时间: |
|
| 查看次数: |
4464 次 |
| 最近记录: |