兄弟们说实话,我感觉我今天特别的兴奋,刚刚发完一篇我就又发了一另一篇文章,
(〜∇)〜(〜∇)〜(〜∇)〜
像我这么难得的新人作者,来点赞来点关注,感谢各位帅哥美女。
我们刚刚介绍了printf相关的一些知识。当然对于c语言关键的输入和输出,我们刚刚说了输出。接下来介绍的就是c语言中常见的输入函数scanf相关的知识。
一,scanf
当我们有了变量,我们需要给变量输⼊值就可以使⽤ scanf 函数,如果需要将变量的值输出在屏幕上
的时候可以使⽤ prinf 函数,下⾯看⼀个例⼦:
int main()
{
int a = 0;
printf("输入一个整数");
scanf("%d", &a);
printf("%d", a);
return 0;
}
注意:标准输⼊⼀般指的就是键盘,标准输出⼀般指的就是屏幕
1.1,scanf使用方法
scanf() 函数⽤于读取⽤⼾的键盘输⼊。 程序运⾏到这个语句时,会停下来,等待⽤⼾从键盘输⼊。
⽤⼾输⼊数据、按下回⻋键后, scanf() 就将其存⼊变量。 scanf() 的语法跟 printf() 类似。
同时scanf它的第⼀个参数是整数,⾥⾯会放置占位符(与 printf() 的占位符基本⼀致)
告诉编 译器如何解读⽤⼾的输⼊,需要提取的数据是什么类型。这是因为 C 语⾔的数据都是有类型的, scanf() 必须提前知道⽤⼾输⼊的数据类型,才能处理数据,它的其余参数就是存放⽤⼾输⼊的变量,格式字符串⾥⾯
例如:一个简单的加法
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a, b = 0;
printf("输入两个整数");
scanf("%d %d", &a, &b);
printf("%d+%d=%d\n", a, b, a + b);
return 0;
}
在上面我们使用了一个取地址符号,如果是直接看这篇文章的人的,我在这里简单的说一下,scanf传递的不是值而是是地址,所以在这里我们使用有关地址的取地址符号。
#define _CRT_SECURE_NO_WARNINGS 1是VS关于scanf不安全所以使用了这个来表明我就使用
这个scanf
怎么一直出现#define _CRT_SECURE_NO_WARNINGS 1
哔哩哔哩上面:【C语言学习问题】VS2013编译器对函数不安全报错的解决办法】(点一下会跳到哔哩哔哩或者直接搜一下)可以解决
1.2scanf特点
scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。
所以,⽤⼾输⼊的数据之间,有⼀个或多个空格不影响 scanf() 解读数据。另外,⽤⼾使⽤回⻋
键,将输⼊分成⼏⾏,也不影响解读
例如
int main()
{
int a, b = 0;
printf("输入两个整数");
scanf("%d %d", &a, &b);
printf("%d+%d=%d\n", a, b, a + b);
return 0;
}
我们来看下面的例子:
int main()
{
int a;
float b;
//我们输入-13.45e1#10
scanf("%d %f", &a, &b);
printf("%d %f", a, b);
return 0;
}
scanf() 读取⽤⼾输⼊时, %d 占位符会忽略起⾸的空格,从 - 处开始获取数据,读
取到 -13 停下来,因为后⾯的 . 不属于整数的有效字符。这就是说,占位符 %d 会读到 -13 ,然后后面的45算浮点数了
1.3scanf的返回值
你去使用函数的时候函数必然是会有返回值的,scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数。 如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或 者遇到读取到⽂件结尾,则返回常量 EOF即
例如
int main()
{
int a = 0;
int b = 0;
int c = 0;
int num =scanf("%d %d %d", &a, &b, &c);
printf("%d %d %d\n", a, b, c);
printf("%d", num);
return 0;
}
实现ctry+z按三下VS会停止:
当我们在上面输入两个数的时候,按三下ctry加z。Vs停止工作,那么scanf在运行的过程中就只读了两个数,所以我们的num返回为2,
他在读取第3个数的时候我们停止了。他读取失败,所以我们的字母c值为0
如果我们不输入值直接停止
如果⼀个数字都不输⼊,直接按3次 ctrl+z ,输出的r是-1,也就是EOF;
1.4scanf() 常⽤的占位符
%c :字符。
%f : float 类型浮点数。
%lf : double 类型浮点数。
%Lf : long double 类型浮点数。
%s :字符串。
%[] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会
停⽌。
上⾯所有占位符之中,除了 %c 以外,都会⾃动忽略起⾸的空⽩字符。 %c 不忽略空⽩字符,总是返
回当前第⼀个字符,⽆论该字符是否为空格。
如果要强制跳过字符前的空⽩字符,可以写成 scanf(" %c", &) ,即 %c 前加上⼀个空格,表
⽰跳过零个或多个空⽩字符。
下⾯要特别说⼀下占位符 %s ,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩
字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌
因为 %s 不会包含空⽩字符,所以⽆法⽤来读取多个单词,除⾮多个 %s ⼀起使⽤。这也意味着,
scanf() 不适合读取可能包含空格的字符串,⽐如书名或歌曲名。另外, scanf() 遇到 %s 占位
符,会在字符串变量末尾存储⼀个空字符 \0 。
scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以,储存字符串时,
很可能会超过数组的边界,导致预想不到的结果。为了防⽌这种情况,使⽤ %s 占位符时,应该指定
读⼊字符串的最⻓⻓度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表⽰读取字符串的最⼤⻓度,后
⾯的字符将被丢弃。
1.4.1例如%c的实例
int main()
{
char a = 0;
scanf("%c", &a);
printf("%cxxxx", a);
return 0;
}
1.4.2例如%s的实例
int main()
{
char a[20] = {0};
scanf("%s", &a);
printf("%s", a);
return 0;
}
1.4.3指定读⼊字符串的最⻓⻓度
int main()
{
char a[20] = {0};
scanf("%5s", &a);
printf("%5s", a);
return 0;
}
1.5赋值忽略符
有时,⽤⼾的输⼊可能不符合预定的格式。
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);
printf("%d %d %d\n", year, month, day);
return 0;
}
错误的格式:
为了避免这种情况, scanf() 提供了⼀个赋值忽略符(assignment suppression character) * 。
只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d", &year, &month, &day);
printf("%d %d %d\n", year, month, day);
return 0;
}
我们在上面的代码中,两个%d中间加了一个%c,并且在c的前面加了一个*表明这两个%c我们不需要返回值,这样我们输入其他格式时都可以算对了。
最后谢谢各位老板
标签:字符,int,scanf,占位,printf,------,新手,main From: https://blog.51cto.com/u_16237653/9345940