郑州七七网站建设,长沙seo优化排名,网站制作费用贵不贵,品牌高端网站建设前言#xff1a; 当有了变量#xff0c;我们需要给变量输入值就可以使用scanf函数#xff0c;如果需要将变量的值输出在屏幕上的时候可以使用printf函数#xff0c;如#xff1a;
#include stdio.h
int main()
{int score 0;printf(请输⼊成绩:);sc…前言 当有了变量我们需要给变量输入值就可以使用scanf函数如果需要将变量的值输出在屏幕上的时候可以使用printf函数如
#include stdio.h
int main()
{int score 0;printf(请输⼊成绩:);scanf(%d, score);printf(成绩是%d\n, score);return 0;
}
运行截图 1.基本用法 scanf函数用于从标准输入通常是键盘读取用户的输入的数据。当程序运行到这个语句时会停下来等待用户从键盘输入。用户输入数据后按下回车键scanf就会处理用户的输入将其存入变量。它的原型定义在头文件stdio.h 。 scanf的语法跟pritnf类似。 scanf(%d, i); 它的第⼀个参数是⼀个格式字符串⾥⾯会放置占位符与 printf() 的占位符基本⼀致告诉编译器如何解读用户的输入需要提取的数据是什么类型。这是因为C语言的数据都是有类型的 scanf() 必须提前知道用户输入的数据类型才能处理数据。 它的其余参数就是存放用户输入的变量格式字符串里面有多少个占位符就有多少个变量。 上面示例中 scanf() 的第⼀个参数 %d 表示用户输入的应该是⼀个整数。 %d 就是⼀个占位符 % 是占位符的标志 d 表示整数。第⼆个参数 i 表示将用户从键盘输⼊的整数存入变量 i 。注意变量前面必须加上 运算符指针变量除外因为 scanf() 传递的不是值⽽是地址 即将变量 i 的地址指向用户输入的值。 如果这里的变量是指针变量比如字符串变量或数组那就不用加 运算符。 下面是一次将键盘输入多个变量的例子 scanf(%d %d %f %f, i, j, x, y); 上面示例中格式字符串 %d%d%f%f 表示用户输⼊的前两个是整数后两个是浮点数⽐如 1 -20 3.4 -4.0e3 。这四个值依次放⼊ i 、 j 、 x 、 y 四个变量。 scanf() 处理数值占位符时会⾃动过滤空⽩字符包括空格、制表符、换⾏符等。 所以用户输入的数据之间有⼀个或多个空格不影响 scanf() 解读数据。另外⽤户使⽤回⻋ 键将输入分成几行也不影响解读。
1
-20
3.4
-4.0e3//-4.0*10^3
上面示例中用户分成四行输⼊得到的结果与一行输⼊是完全⼀样的。 每次按下回车键以后scanf() 就会开始解读如果第一行匹配第⼀个占位符那么下次按下回车键时就会从第⼆个占位符开始解读。 scanf() 处理用户输入的原理是用户的输入先放入缓存等到按下回车键后按照占位符对缓存进行解读。 解读用户输入时会从上⼀次解读遗留的第⼀个字符开始直到读完缓存或者遇到第⼀个不符合条件的字符为止。小数在内存中有时无法精确保存
// ⽤⼾输⼊ -13.45e12# 0
#include stdio.h
int main()
{int x;float y;scanf(%d%f, x, y);printf(%d %f, x, y);return 0;
} 运行截图 分析
上⾯⽰例中 scanf() 读取用户输入时 %d 占位符会忽略起首的空格从 - 处开始获取数据读 取到 -13 停下来因为后⾯的 . 不属于整数的有效字符。这就是说占位符 %d 会读到 -13 。 第⼆次调用 scanf() 时就会从上一次停止解读的地方继续往下读取。这⼀次读取的首字符 是 . 由于对应的占位符是 %f 会读取到 .45e12 这是采用科学计数法的浮点数格式。后面的# 不属于浮点数的有效字符所以会停在这里, # 0留在缓存区。
2.scanf返回值 scanf() 的返回值是⼀个整数表示成功读取的变量个数。 如果没有读取任何项或者匹配失败则返回 0 。
如果在成功读取任何数据之前发生了读取错误或者遇到读取到⽂件结尾则返回常量EOF。
//一组输入
#include stdio.h
int main()
{int a 0;int b 0;float f 0.0f;int r scanf(%d %d %f, a, b, f);//返回读取的个数printf(a%d b%d f%f\n, a, b, f);printf(r %d\n, r);return 0;
}
输入输出测试 如果输入2个输后按ctrlz后按回车提前结束输入 在VS环境中按3次 ctrlz 才结束了输⼊我们可以看到r是2表⽰正确读取了2个数值。 如果⼀个数字都不输⼊直接按3次 ctrlz ,输出的r是-1也就是EOF 3.多组输入
//多组输入
#includestdio.h
int main()
{int a 0, b 0;//while (scanf(%d %d, a, b) 2)while(scanf(%d %d, a, b)!EOF){int c a b;printf(%d\n, c);}return 0;
}
运行示例 从运行示例图可以看出由于换行符\n,光标移动到下一行等待我们的输入这就是多组输入 。
4.占位符 scanf() 常用的占位符如下与 printf() 的占位符基本⼀致。 • %c 字符。 • %d 整数。 • %f float 类型浮点数。 • %lf double 类型浮点数。 • %Lf long double 类型浮点数。 • %s 字符串从非空字符开始读取遇到空白字符停止。 • %[] 在方括号中指定⼀组匹配的字符数字字符比如 %[0-9] 遇到不在集合之中的字符匹配将会停止。 上面所有占位符中除了 %c 以外都会自动忽略起首的空白字符。 %c 不忽略空白字符总是返回当前第⼀个字符无论该字符是否为空格。如果要强制跳过字符前的空白字符可以写成 scanf( %c, ch) 即 %c 前加上⼀个空格表示跳过零个或多个空白字符。
#includestdio.h
int main()
{char ch 0;scanf(%c, ch);//输入空格空格1printf(%cxxx, ch);//输出空格空格1xxxreturn 0;
} 下面要特别说⼀下占位符 %s 它其实不能简单地等同于字符串。它的规则是从当前第⼀个非空白字符开始读起直到遇到空⽩字符即空格、换⾏符、制表符等为⽌。 因为 %s 不会包含空白字符所以无法用来读取多个单词除非多个 %s ⼀起使用。这也意味着 scanf() 不适合读取可能包含空格的字符串比如书名或歌曲名。另外 scanf() 遇到 %s 占位 符会在字符串变量末尾存储⼀个空字符 \0 。 scanf() 将字符串读⼊字符数组时不会检测字符串是否超过了数组长度。所以储存字符串时 很可能会超过数组的边界导致预想不到的结果。为了防⽌这种情况使用 %s 占位符时应该指定读⼊字符串的最长长度即写成 %[m]s 与printf输出部分字符串类似https://blog.csdn.net/wait___wait/article/details/135287228其中的 [m] 是⼀个整数表示读取字符串的最大长度后面的字符将被丢弃。
5.赋值忽略符 有时用户的输入可能不符合预定的格式。
#include stdio.h
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;
}
上述示例中如果用户输入 2020-01-01 就会正确解读出年、⽉、⽇。问题是用户可能输⼊其他 格式⽐如 2020/01/01 这种情况下 scanf() 解析数据就会失败。 为了避免这种情况 scanf() 提供了⼀个赋值忽略符 。 只要把 * 加在任何占位符的百分号后面该占位符就不会返回值解析后将被丢弃。
#include stdio.h
int main()
{int year 0;int month 0;int day 0;scanf(%d%*c%d%*c%d, year, month, day);return 0;
}
上面示例中 %*c 就是在占位符的百分号后面加入了赋值忽略符 * 表示这个占位符没有对应的变量解读后不必返回。 欢迎斧正