scanf()函数中%符号后的#符号是什么意思?

以下代码在C中的含义是什么
scanf("%d%#d%d",&a,&b,&c);

如果给定值1 2 3,则输出为1 0 0

P.S-我知道它与printf()语句一起使用,但是在scanf()语句中它给出了随机行为.

解决方法

TL; DR; – 在scanf()函数的格式字符串中的%符号后面的#是错误代码.

说明:

#here是一个标志字符,在fprintf()和family中允许,而不是在fscanf()和family中.

对于您的代码,#after%的存在被视为无效的转换说明符.根据7.21.6.2,

If a conversion specification is invalid,the behavior is undefined

所以,你的代码产生undefined behaviour.

提示:您可以检查scanf()的返回值,以检查已成功“扫描”了多少元素.

但是,在printf()中使用#with%d的FWIW也是undefined behaviour.

仅供参考:根据C11标准文件,章节§7.21.6.1,标志字符部分,(强调我的)

#

The result is converted to an ‘‘alternative form’’. For o conversion,it increases the precision,if and only if necessary,to force the first digit of the result to be a zero (if the value and precision are both 0,a single 0 is printed). For x (or X) conversion,a nonzero result has 0x (or 0X) prefixed to it. For a,A,e,E,f,F,g,and G conversions,the result of converting a floating-point number always contains a decimal-point character,even if no digits follow it. (Normally,a decimal-point character appears in the result of these conversions only if a digit follows it.) For g and G conversions,trailing zeros are not removed from the
result. For other conversions,the behavior is undefined.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...