超详解c语言scanf(零基础也能看懂)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言·:什么是scanf?

在百度百科中是这样描写scanf的:scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>。(在有一些实现中,printf函数与scanf函数在使用时可以不使用预编译命令)它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。


提示:以下是本篇文章正文内容,下面案例可供参考

一、scanf在一些软件不能直接用的解决方法和注意事项

如上所见scanf是一个格式输出库函数,因为它是库函数所以它有一个头文件,这个头文件是 <stdio.h>
在使用时一定要引用这个头文件。在一些编程软件中不能直接用如vs2022(下图为实机图)

这时发生报错解决方法很简单只需要在代码前加一段代码就行

#define   _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int i = 1;
	scanf("%d", &i);
	printf("%d", i);

	return 0;
	
}

如上可见只加了***#define _CRT_SECURE_NO_WARNINGS 1*** 这段代码便可以使用这段代码的出处在你的状态栏上

只需要在#define上将这段代码复制去在加个数字1就行。
注意:不要那个点(.),这段代码在整个代码的最上面

二、scanf输入格式的标准化

scanf是一个输入格式化的库函数,如它的定义一样是一个可以输入值的函数它可以将你输入的数据带入到格式符中但是你输入的值一定是要符和格式符的相应格式如你用%d就不能输入字母串下面便介绍一些格式符。

格式符

格式输出化的关键之一是格式符(说明符(specifier)用于规定输出数据的类型)在c语言中有许多的格式符下面便是一些常见的格式符:

规范描述提取的字符
% i整数任意数量的数字,可以选择以符号(+ 或 -)开头。默认采用十进制数字 (0-9),但 0 前缀引入了八进制数字 (0-7) 和 0x 十六进制数字 (0-f)。有符号参数。
%d 或% u十进制整数任意数量的十进制数字 (0-9),可以选择以符号(+ 或 -)开头。d 表示有符号参数,u 表示无符号参数。
%o八进制整数任意数量的八进制数字 (0-7),可以选择以符号(+ 或 -)开头。无符号参数。
%x十六进制整数任意数量的十六进制数字(0-9、a-f、A-F),可以选择以 0x 或 0X 开头,也可以以符号(+ 或 -)开头。无符号参数。
%f, %e, %g浮点数一系列十进制数字,可选地包含小数点,可以选择以符号(+ 或 -)开头,也可以后跟 e 或 E 字符和十进制整数(或 支持的其他一些序列)。符合 C99 的实现还支持十六进制浮点格式(如果前面带有 或)。strtod0x0X
%c字符下一个字符。如果指定了 1 以外的宽度,则该函数将准确读取宽度字符,并将它们存储在作为参数传递的数组的连续位置。末尾不追加 null 字符。
%s字符串任意数量的非空格字符,在找到的第一个空格字符处停止。在存储序列的末尾自动添加终止 null 字符。
%p指针地址表示指针的字符序列。使用的特定格式取决于系统和库实现,但它与 fprintf 中用于格式化 %p 的格式相同。
%[字符]扫描集括号之间指定的任意数量的字符。不是第一个字符的短划线 (-) 可能会在某些库实现中产生不可移植的行为。
%[^字符]否定扫描集任意数量的字符,其中没有一个指定为括号之间的字符。
%n计数不消耗任何输入。到目前为止读取的字符数存储在指向的位置。stdin
%%%一个 % 后跟另一个 % 匹配一个 %。

除 n 外,任何说明符都应至少使用一个字符。否则,匹配将失败,扫描将到此结束

**上面的格式符在有需要时可以查询,所以建议收藏这篇文章。

scanf需要补充变量的变量地址符号&

在使用scanf时要用变量地址符号&不然的话要报错如下面的代码便是错误示范

#define   _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 1;
	scanf("%d", a);
	printf("%d", a);
	return 0;
	
}

它没有加变量地址符号&这样的话scanf无法识别数据a,要加变量地址符号&这段代码才完整如下面代码

#define   _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 1;
	scanf("%d", &a);
	printf("%d", a);
	return 0;
	
}

这才能改变和输入数据,·但是我们如何用scanf输入一段带空格的句子呢。

如何用scanf输入一段带空格的句子

要使用 scanf 输入一段带空格的句子,可以使用 %[^\n] 格式字符串。这将允许 scanf 读取输入,直到遇到换行符为止,从而允许输入包含空格的句子。下面是一个简单的示例代码:

#define   _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main() {
    char sentence[100];
    printf("请输入一段带空格的句子:\n");
    scanf(" %[^\n]", sentence);
    printf("输入的句子是:%s\n", sentence);
    return 0;
}


这段代码的结果是

在使用scanf时还有加,(逗号)与不加逗号的疑问那么它们的区别是什么呢?

scanf加逗号与不加逗号的区别

在使用 scanf 函数时,,(逗号)的作用是用来指示输入中的分隔符。在没有逗号的情况下,scanf 会按照格式字符串中的格式要求依次读取输入,直到遇到空白字符(空格、制表符、换行符等)为止。而在加上逗号的情况下,scanf 会忽略输入中的空白字符,并且只有在遇到指定的分隔符时才会停止读取输入。

举个例子,考虑以下两个 scanf 语句:

#define   _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main() {
    int a, b;
    // 不加逗号
   scanf("%d %d", &a, &b); // 用户输入:10 20

    // 加逗号
    scanf("%d,%d", &a, &b); // 用户输入:10,20
    printf("%d\n%d\n", a, b);

}

}

这时它们的输出结果结果有很大不同如前面的是不加逗号的结果。

这时显示的是正常结果那么不加逗号的呢?

这时显示的是错误结果这是为啥呢?

在第一个例子中,用户输入的是 10 和 20,由于没有逗号作为分隔符,scanf 会将这两个整数分别赋值给 a 和 b。而在第二个例子中,用户输入的是 10,20,由于逗号作为分隔符,scanf 会将整个 10,20 作为一个整体,并将其赋值给 a,然后将左侧数字给a,b值便是随机生成的乱码。

因此,加上逗号会改变 scanf 函数对输入的解释方式,使其在遇到指定的分隔符时停止读取输入。

这便是我对于scanf的一点拙见,希望大家的斧正!

  • 69
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值