c - 在格式控制字符串中使用消息

在使用scanf 函数时,我一直在使用类似scanf("%d",&x); 的格式字符串。但是,我前几天对一些事情很好奇,所以我想问一个问题。

当您将字符放在 scanf 函数的引号中时会发生什么?

例子:

printf("Please enter the date you were born: ex.1999/5/6 : ")
scanf("%d/%d/%d", &year, &month, &date);

最佳答案

scanfstdin 读取数据流并尝试解析您的格式字符串。如果不合适,它会停止处理。重要的是要了解输入的其余部分保留在 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/

相关文章:

c++ - 临时初始化和引用初始化

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

typescript - 类型错误 : Cannot find module 'firebase-f

node.js - Remix.run 不使用 node.js 作为后端吗?