在使用scanf
函数时,我一直在使用类似scanf("%d",&x);
的格式字符串。但是,我前几天对一些事情很好奇,所以我想问一个问题。
当您将字符放在 scanf
函数的引号中时会发生什么?
例子:
printf("Please enter the date you were born: ex.1999/5/6 : ")
scanf("%d/%d/%d", &year, &month, &date);
最佳答案
scanf
从 stdin
读取数据流并尝试解析您的格式字符串。如果不合适,它会停止处理。重要的是要了解输入的其余部分保留在 stdin
流中以供后续读取。 scanf
返回已成功解析的值的数量。
根据我的经验,最好自己编写一个小程序并测试其行为:
#include "stdio.h"
void main() {
int year = 0;
int month = 0;
int date = 0;
int count;
while (1) {
printf("enter data:\n");
count = scanf("%d/%d/%d", &year, &month, &date);
printf("data received:\n");
printf("%d-%d-%d count=%d\n", year, month, date, count);
}
}
示例 1:重新开始并输入正确的数据:
enter data:
1/2/3
data received:
1-2-3 count=3
示例 2:重新开始并输入错误数据:
enter data:
1 2 3
data received:
1-0-0 count=1
enter data:
data received:
2-0-0 count=1
enter data:
data received:
3-0-0 count=1
你可以看到 scanf
只读取数据直到 1
之后的空格,因为它不适合格式字符串。 scanf
只改变第一个变量的值。您输入的其余部分,即 2 3
,仍在 stdin
中。循环继续,下一次调用 scanf 读取 2
。跳过数字前面的空格。这发生在没有任何用户交互的情况下!再次没有找到斜线。等等。在不同的情况下亲自尝试并了解使用 scanf 是一件危险的事情......如果您不初始化变量并且解析失败,您将获得未初始化的数据!
https://stackoverflow.com/questions/71801896/
相关文章:
ios - 什么时候在 ios 中选择 serialQueue 而不是并发队列
kubernetes - kubectl 等到 pod 消失(终止)
node.js - 如何在某个日期之前安装 Node 包及其依赖项?
c# - 使用 EF Core 按 Id 检索实体的通用方法
java - 如何使用 Collectors.collectionAndThen 和 Collect
c - 你怎么能告诉计算机它正在添加而没有 addl 在程序集中
android - 我无法将 Android 项目从 Delphi 10.4 迁移到 Delphi