加强网站网络安全建设方案,大地资源网在线观看免费,山东公司网站推广优化,盐城网站开发效果文章目录 引入cin基本用法输入多个变量换行符存放在缓冲区中 cin.get()基本用法重载函数换行符残留在缓冲区中 cin.getline()基本使用重载函数换行符不会残留在缓冲区中 string 流中的 getline()总结用法总结几个输入实例输入格式输入格式输入格式输入格式 输出格式 写在最后 引… 文章目录 引入cin基本用法输入多个变量换行符存放在缓冲区中 cin.get()基本用法重载函数换行符残留在缓冲区中 cin.getline()基本使用重载函数换行符不会残留在缓冲区中 string 流中的 getline()总结用法总结几个输入实例输入格式输入格式输入格式输入格式 输出格式 写在最后 引入
在 ACM 模式的题目编程中我们需要自己解决程序的输入与输出问题。我们自己解决程序的输入其实就是从键盘输入数据然后将输入的数据传递我们定义的变量其简要过程如下
使用输入流 cin 或其他输入函数从键盘读取数据时程序会向操作系统发出请求以获取输入就是程序运行后终端屏幕上那个一闪一闪输入提示符敲击键盘输入几个字符当我们想要结束字符的输入时按下回车键操作系统将用户输入的数据一次性放入输入缓冲区中C 程序通过 cin 或其他输入流来读取缓冲区中的数据。
代码运行时需要的变量也许是一个字符也许是一个整型数字也许是一个带有空格的字符串等等这些我们都可以通过键盘输入然后按下回车键放入输入缓冲区但是不同的 输入流 或者 输入函数 从缓冲区读取的数据效果也是不同的。
如果想在以空格分隔的缓冲区数据中读取多个数据我们应该使用什么样的 输入流 或者 输入函数 如果想在缓冲区中读取指定字符之前的数据我们应该使用什么样的 输入流 或者 输入函数 如果想在缓冲区中按行读取数据我们应该使用什么样的 输入流 或者 输入函数
如果你可以轻松应对以上三个问题那么厉害了你已经基本掌握cpp中的常用的从标准输入流读取数据的操作了也可以看看这篇博文回顾回顾嘛。如果对以上问题的答案还不太清楚那么同学一定要好好看看这篇文章啊。
接下来就步入正题看一下不同的 输入流 或者 输入函数 从缓冲区读取数据具有怎么样的不同效果。
cin
基本用法
我们先来介绍 C 中最常用的一个标准输入流对象 cin。
我们常用 cin num 来从缓冲区中读取数据到 num 中num 的变量类型可以是多种类型最常用的有 int、string、char、double、float等等。
先看一个小例子
#include iostream
using namespace std;int main() {int n;cin n;cout n n endl;return 0;
}在这个示例中我们从键盘输入了一个整型字符比如说 9按下回车键整型字符会被存入到缓冲区中然后使用 cin 来读取缓冲区的数据最后通过标准输出流 cout 将 n 9输出到终端窗口。
cin 从缓冲区中读数据读取的是第一个非空白字符开始到第一个结束符之间的字符串。这个结束符可以是空格也开始是制表符也可以是换行符。空格、制表符、换行符是内置的 cin 的结束符如果想用其他的字符来提前结束读取数据需要自定义。
输入多个变量
cin 是直接从缓冲区读取数据的如果缓冲区中还有数据我们就不需要请求键盘输入直接从缓冲区读取数据。比如下面的例子我们在输入第一个字符串之后用空格隔开然后输入了第二个字符串。对应的代码以及输出结果如下所示。
#include iostream
using namespace std;int main() {char s[100];cout 请输入字符串: endl;cin s;cout s endl;cin s;cout s endl;return 0;
}由于 cin 在遇到空格或者制表符/tab时会停止读取输入因此第一个 cin 只会读取第一个字符串第一个非空白字符开始到下一个空格字符结束之间的字符串。这时候缓存区中还有残留的数据因此下一个 cin 会直接从缓冲区中读取数据而不会请求输入。
利用该原理我们可以从以空格或者制表符为分隔符的缓冲区数据中读取多个数据。
换行符存放在缓冲区中
按下相应的结束符才会从缓冲区读取数据到变量中cin 每次从缓冲区中读取一个字符串以空格作为字符或者字符串的分隔符。需要注意的是最后一个换行符会放在缓冲区中。比如下面的示例该示例中我们使用 cin.get() 从缓冲区中读取单个字符。
#include iostream
using namespace std;int main() {char s1[100], s2[100], ch;cout 请输入字符串: endl;cin s1 s2;cout s1 endl;cout s2 endl;cin.get(ch);cout (int)ch endl;return 0;
}我们从键盘输入 cc ff然后按下回车键缓冲区中的数据为 cc ff\n我们将缓冲区的字符串 cc 和 ff 分别传给 s1 和 s2换行符传给 ch。最后的输出结果如下图所示因为换行符的 ASCII 码为 10所以最后会输出一个 10。 cin.get()
基本用法
cin.get() 是C标准库中的函数用于从输入流中获取字符包括空白字符如空格、制表符和换行符。与 cin 不同cin.get() 不会将制表符、空白字符空格视为终止输入的标志因此您可以使用它来获取包括空白字符在内的整行文本。默认情况下cin.get() 使用换行符\n作为定界符终止读取数据的结束符表示读取到换行符时结束。
运行以下代码然后输入 123 456再按下回车键输出结果如图所示
#include iostream
using namespace std;int main() {char s1[100];cin.get(s1, 100);cout s1 endl;return 0;
}类似的代码如果我们使用 cin 读取缓冲区的数据那将只会输出 123。
重载函数
在头文件 中定义的 get() 函数有以下几种重载形式
// single character (1) 从标准流中读取单个字符
int get();
istream get (char c);// c-string (2) 从标准流中读取字符串并存储在c标准的s字符串中
istream get (char* s, streamsize n);
istream get (char* s, streamsize n, char delim);// stream buffer (3)
istream get (streambuf sb);
istream get (streambuf sb, char delim);我们最常用的是使用cin.get() 从标准输入流中读取单个字符以及读取多个字符存储在c标准的字符串中。
换行符残留在缓冲区中
cin.get() 与 cin 都是遇到相应的结束符才会结束从缓冲区读取数据它们都不对换行符进行处理换行符都会残留在缓冲区中。如果下次不想从上一次的缓冲区中读取数据可以使用 cin.ignore() 忽略上一个缓冲区中的数据或者使用 cin.getlin()。
cin.getline()
基本使用
cin.getline() 是C标准库中的函数用于从输入流中读取一行文本并允许您指定一个定界符字符来结束读取。默认的定界符是换行符 (\n)表示读取到换行符时结束。但您可以通过提供第三个参数来指定自定义的定界符字符。
重载函数
在头文件 中定义的 getline 函数有以下两种重载形式
istream getline (char* s, count n);
istream getline (char* s, count n, char delim);作用是 从istream中读取至多 n 个字符包含结束标记符’\0’保存在 s 对应的数组中实际上只从输入流中最多读取 n-1 个字符到数组 s 中因为最后一个字符必须是结束标志符 \0也就是c语言中所有的字符串中的最后一个字符 。
换行符不会残留在缓冲区中
cin.getline() 与 cin 、cin.get() 的使用基本一致唯一的区别就是 cin 、cin.get() 遇到结束符终止从缓存区读取数据时换行符会残留在缓冲区中而使用 cin.getline() 换行符不会残留在缓冲区中。
现在我们使用getline来从标准输入中读取数据
#include iostreamusing namespace std;int main() {char str[100];cin.getline(str, 100);cout str str endl;char c cin.get();cout (int)c endl;return 0;
}我们运行以上代码输入任意一个字符串比如 “123 589”按下回车键屏幕上会出现 “str 123 589”左图。我们再按下回车键屏幕上才会出现 10右图。 如果我们执行以下这段代码
#include iostreamusing namespace std;int main() {char str[100];cin.get(str, 100);cout str str endl;char c cin.get();cout (int)c endl;return 0;
}输出的结果为 为什么会有如此差异因为使用 cin.getline() 换行符不会残留在缓冲区中。
在第一段代码中我们还需要从缓冲区读取一个字符缓冲区中已经没有任何字符了因此会有提示输入符出现我们按下回车键换行符屏幕上输出了我们按下的回车键换行符的 ASCII 码。
在第二段代码中我们使用 cin.get() 来从标准输入读取数据按下回车键换行符缓冲区中的字符串传给了 str。这时候换行符会残留在缓冲区中这个时候又需要从缓冲区中读取一个字符于是就顺理成章的将换行符传给了 c屏幕上也就会接着输出换行符的 ASCII 码了。
string 流中的 getline() 头文件中也有 getline() 函数它们的使用与 中的用法基本一致只有三点不同
头文件的不同getline() 中的多了第一个参数 istream is通常填上 cin表示的是从标准输入流中读取数据getline() 中的接收字符串变量为 string而不是 char*。在C代码中建议使用getline()因为接收字符串的变量是 string是可以动态扩展的类型。
除了以上三点不同之外其他的用法都与 中的 cin.getline() 用法一致包括 getline() 不会将换行符残留在缓冲区中。
总结
用法总结
cin.get() 和 cin.getline() 是输入流中的使用之前需要包含头文件 。cin 是输入输出流中的使用之前需要包含头文件 。getline() 是字符串流的使用之前需要包含头文件 。
从标准输入读取单个或者是多个变量以空格、制表符、换行符隔开尤其是整型变量或者从多行读取整型变量到数组使用 cin。
从标准输入读取单个字符推荐使用输入流中的 cin.get()。
从标准输入读取单行字符串、多行字符串的推荐使用字符串流中的 getline()。
cin、cin.get() 会将换行符残留在缓冲区中getline() 和 cin.getline() 不会。
几个输入实例 输入格式 第一行有两个非负整数 mn。他们分别表示数组的长度和宽度。 接下来 m 行每行有 n 个整数。 在ACM编程下最常遇到的就是从键盘输入 m 行 n 列数据到数组了以下是从键盘输入 int 整型数据的代码。
#include iostream
#includevectorusing namespace std;int main() {int m, n;cin m n;vectorvectorint grids(m, vectorint(n));for (int i 0; i m; i) {for (int j 0; j n; j) {cin grids[i][j];}}/* 此段代码用来测试输入是否正确for (int i 0; i m; i) {for (int j 0; j n; j) {cout grids[i][j] ;}cout endl;}*/return 0;
}我们在命令行窗口输入数据的方法有两种
第一种在一行中输入所有的数据第一个数是行数m第二个数是列数n接下来的是第一行的所有列中的数字然后是第二行中的所有列的数字直到输入完所有m行n列的数字相邻两个数字之间都用空格隔开第二种在第一行输入行数m和列数n以空格隔开按下回车键接下来的m行每一行输入n个数字每输完一行数字就按一下回车键最后按下的那个回车键会存储在缓冲区中。 输入格式 第一行包含两个正整数 m , n m,n m,n分别表示 A A A 串和 B B B 串的长度。 第二行为一个长度为 m m m 的字符串 A A A。 第三行为一个长度为 n n n 的字符串 B B B。 两个串均仅由小写字母和 * \texttt * * 组成其中 * \texttt * * 表示相应位置已经残缺。 #include iostream
#include string
using namespace std;int main() {int m, n;string A, B;cin m n A B;// // 测试输入是否正确// cout m n endl;// cout A B endl;return 0;
}输入格式 多行字符串。 每一行输入一个含有空格的字符串输入多行遇到 “END” 结束输入。 #include iostream
#include string
#include vector
using namespace std;int main() {string str;vectorstring strs;getline(cin, str);while (str ! END ) {strs.push_back(str);getline(cin, str);}// for testfor (auto str : strs) {cout str endl;}return 0;
}输入格式 输入在一行中给出不知道多少个绝对值不超过1000的整数。 输出格式 在一行中输出最后一次出现的 “250” 是第几个数字计数从1开始。如果没有出现 “250” 这个数输出为 0。 // #include iostream// using namespace std;// int main()
// {
// int ct 0;
// int a, pos 0;
// do
// {
// ct;
// cin a;
// if (a 250)
// pos ct;
// }
// while (cin.get() ! \n);
// cout pos;
// return 0;
// }#include iostreamusing namespace std;int main() {int cnt 0;int a, pos 0;while (cin.get() ! \n) {cnt;cin a;if (a 250) {pos cnt;}}cout pos;return 0;
}写在最后
如果文章内容有任何错误或者您对文章有任何疑问欢迎私信博主或者在评论区指出 。
如果大家有更优的时间、空间复杂度方法欢迎评论区交流。
最后感谢您的阅读如果感到有所收获的话可以给博主点一个 哦。