日常使用 c++的时候,总会接触到多种输入(通常是键盘)读取数据的流对象。
以下是对cin、cin.get()、cin.getline()、getline()、peek()和ignore()六中常用的输入(通常是键盘)读取数据的流对象的详细介绍:
cin
cin是C++标准库中用于从标准输入(通常是键盘)读取数据的流对象。它与输出流对象cout一起使用,可以实现基本的输入输出操作。cin可以用于读取不同类型的数据,如整数、浮点数、字符和字符串等。
cin 的读取规则:
cin的读取字符规则如下:
- 当执行cin对象时,会将各种字符读入到缓冲器中,包括回车键(‘\n’)、空格键(’ ‘)、tab键(’\t’)。
- 读取时,cin从第一个非空格、非回车、非tab键的位置开始读取,当与所要读取类型一致时则开始读取,遇上空格、tab键不再读取、回车结束。
- 缓冲器中光标定位在空格、tab、回车之前。
综上所述,cin的读取字符规则是先存入再读取,遇到空格、tab键或回车结束读取。
使用方法:
int num;
cin >> num; // 读取一个整数并存储在变量num中
cin.get()
cin.get()的读取规则如下:
- 它从标准输入(通常是键盘)读取一个字符,并将其存储在指定的字符变量中。
- cin.get()不会忽略空格、制表符或换行符。也就是说,它会将它们作为字符读取。
- 当使用cin.get()时,输入流中的下一个字符会被读取,但不会被删除。这意味着在下一次读取操作之前,该字符仍然会留在输入流中。
当一次输入多个字符时,也只会读取第一个字符
以下是使用cin.get()的代码示例:
#include <iostream>
using namespace std;
int main() {
char c;
cout << "请输入一个字符:" << endl;
cin.get(c); // 读取一个字符并存储在变量c中
cout << "您输入的字符是:" << c << endl;
return 0;
}
在上述示例中,程序会提示用户输入一个字符。然后,使用cin.get()函数读取用户输入的字符,并将其存储在变量c中。最后,程序输出用户输入的字符。请注意,由于cin.get()不会忽略空格、制表符或换行符,因此如果用户输入了这些字符,它们也会被读取并存储在变量c中。
cin.getline()
cin.getline()的读取规则如下:
- 它从标准输入(通常是键盘)读取一行数据,并将其存储在指定的字符串变量中。
- cin.getline()会自动忽略空格、制表符和换行符。这意味着在读取一行数据时,这些字符会被跳过,不会被包含在读取的数据中。
- cin.getline()可以指定读取的最大长度,以避免缓冲区溢出。如果读取的字符数达到指定的长度,读取将停止,并且输入流中的剩余字符不会被删除。
2 个参数
#include <iostream>
#include <string>
using namespace std;
int main() {
string line;
cout << "请输入一行字符串:" << endl;
cin.getline(line, 100); // 读取一行字符串并存储在变量line中,最大长度为100
cout << "您输入的字符串是:" << line << endl;
return 0;
}
在上述示例中,程序会提示用户输入一行字符串。然后,使用cin.getline()函数读取用户输入的字符串,并将其存储在变量line中。cin.getline()的第二个参数指定了读取的最大长度为100个字符。如果用户输入的字符串长度超过100个字符,那么只有前100个字符会被存储在变量line中,其余的字符仍然会留在输入流中。最后,程序输出用户输入的字符串。
1 个参数
cin.getline()函数可以只写一个参数。在这种情况下,它将读取一行字符串,直到遇到换行符为止,并将读取的数据存储在指定的字符串变量中。同时,它也会自动忽略空格和制表符。例如:
#include <iostream>
#include <string>
using namespace std;
int main() {
string line;
cout << "请输入一行字符串:" << endl;
cin.getline(line); // 读取一行字符串并存储在变量line中,直到遇到换行符为止
cout << "您输入的字符串是:" << line << endl;
return 0;
}
在这个示例中,cin.getline(line)将读取一行字符串,并将其存储在变量line中。读取将一直进行,直到遇到换行符为止。同时,输入流中的空格和制表符将被自动忽略。
0 个参数
cin.getline()函数可以不写参数。在这种情况下,它不会读取任何字符或数据,而是清空输入缓冲区中的换行符。这通常用于在读取一行数据之前清除换行符,以确保读取的数据是完整的。例如:
#include <iostream>
using namespace std;
int main() {
cout << "请输入一行字符串:" << endl;
cin.getline(); // 清空输入缓冲区中的换行符
string line;
cin.getline(line); // 读取一行字符串并存储在变量line中
cout << "您输入的字符串是:" << line << endl;
return 0;
}
在这个示例中,第一次调用cin.getline()函数没有参数,它将清空输入缓冲区中的换行符。然后,第二次调用cin.getline(line)将读取一行字符串,并将其存储在变量line中。
getline()
getline()是一个通用的函数,用于从输入流中读取一行数据,并将其存储在指定的字符串变量中。它可以指定分隔符,以指定读取的数据应在哪种字符之间结束。默认的分隔符是换行符。
使用方法:
string str;
getline(cin, str); // 读取一行字符串并存储在变量str中,直到遇到换行符为止
用法:接收一个字符串,可以接收空格并输出,需包含“#include”
#include<iostream>
#include<string>
using namespace std;
main ()
{
string str;
getline(cin,str);
cout<<str<<endl;
}
输入:jkljkljkl
输出:jkljkljkl
输入:jkl jfksldfj jklsjfl
输出:jkl jfksldfj jklsjfl
cin.getline()和getline()
1、cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数
2、当同时使用cin>>,getline()时,需要注意的是,在cin>>输入流完成之后,getline()之前,需要通过
str="\n";
getline(cin,str);
的方式将回车符作为输入流cin以清除缓存,如果不这样做的话,在控制台上就不会出现getline()的输入提示,而直接跳过,因为程序默认地将之前的变量作为输入流。
看下面代码:
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
int age;
//standard input(cin)
cout<<"Please enter an integer value as your age: ";
cin>>age;
cout<<"Your ager is: "<<age<<".\n";
//cin and string
string mystr;
cout<<"What's your name? "<<endl;
mystr="\n";
getline(cin,mystr);
getline(cin,mystr);
cout<<"Hello,"<<mystr<<".\n";
char sex;
cout<<"Please enter a F or M as your sex: ";
cin>>sex;
cout<<"Your sex is: "<<sex<<endl;
cout<<"What's your favorite team? ";
mystr="\n";
getline(cin,mystr);
getline(cin,mystr);
cout<<"I like "<<mystr<<".\n";
system("pause");
return 0;
}
scanf、gets和getchar
scanf、gets和getchar是C语言中用于从标准输入(通常是键盘)读取数据的函数。下面是对这三个函数的讲解和示例代码:
1. scanf()
scanf函数用于格式化输入,可以读取多种类型的数据,如整数、浮点数、字符等。
示例代码:
#include <stdio.h>
int main() {
int a;
float b;
char c;
scanf("%d %f %c", &a, &b, &c);
printf("整数:%d,浮点数:%f,字符:%c\n", a, b, c);
return 0;
}
在上述代码中,scanf函数读取用户输入的整数、浮点数和字符,并将它们存储在变量a、b和c中。
2. gets()
gets函数用于从标准输入读取一行字符串,直到遇到换行符或EOF。但是需要注意的是,gets函数存在缓冲区溢出的问题,因此在C语言中不推荐使用。
示例代码:
#include <stdio.h>
int main() {
char str[100];
gets(str);
printf("读取的字符串:%s\n", str);
return 0;
}
在上述代码中,gets函数读取用户输入的字符串,并将它存储在字符数组str中。需要注意的是,由于gets函数存在缓冲区溢出的问题,因此在实际编程中不推荐使用。可以使用fgets代替。
3. getchar()
getchar函数用于逐个字符地读取输入,每次读取一个字符并返回。当用户输入字符串时,getchar函数可以一次读取一个字符,直到遇到换行符或EOF。
示例代码:
#include <stdio.h>
int main() {
char ch;
printf("请输入一个字符:");
ch = getchar();
printf("您输入的字符是:%c\n", ch);
return 0;
}
在上述代码中,getchar函数读取用户输入的一个字符,并将它存储在变量ch中。需要注意的是,getchar函数只能读取一个字符,如果需要读取一行字符串,可以使用gets或fgets函数。