Blog用于记录个人学习编程
1.cin.getline的输入
#include<iostream>
#include<string>
using namespace std;
int main(){
char s[10];
char a;
char b;
cin.getline(s,5);
for(int i = 0; i < 5; i++)
{
if(s[i] == '\n') cout << "enter" << ' ';
else if(s[i] == '\0') cout << "zero" << ' ';
else cout << s[i] << ' ';
}
a = getchar();
if(a == '\n') cout << "enter" << ' ';
else cout << a << "char" << ' ';
b = getchar();
if(b == '\n') cout << "enter" << ' ';
}
- 输入为123+回车时 打印1 2 3 zero zero,a=getchar()等待输入。此时cin.getline自动在末尾添加\0,缓冲区内没有内容,\n没有存入字符串内。
- 输入为1234+回车时 打印1 2 3 4 zero,a=getchar()等待输入。此时cin.getline将\n替换成\0,缓冲区内同样没有内容。
- 输入为12345+回车时 打印1 2 3 4 zero 5char enter。此时cin.getline没有接收5,在4后面添加\0,缓冲区内的5和回车被后面的getchar吸收。
2.getline(cin, string)的输入
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
//char a;
//char b;
getline(cin, s);
for(int i = 0; i < 5; i++)
{
if(s[i] == '\n') cout << "enter" << ' ';
else if(s[i] == '\0') cout << "zero" << ' ';
else cout << s[i] << ' ';
}
}
getline(cin,string)的用法比较简单,调用string库的getline函数,直到遇到换行符终止读入,将其替换成\0,缓冲区内没有内容。
3.fgets(char*, size, stdin)的输入(Windows)
#include<iostream>
#include<string>
using namespace std;
int main(){
char s[10];
char a;
char b;
fgets(s, 5, stdin);
for(int i = 0; i < 5; i++)
{
if(s[i] == '\n') cout << "enter" << ' ';
else if(s[i] == '\0') cout << "zero" << ' ';
else cout << s[i] << ' ';
}
a = getchar();
if(a == '\n') cout << "enter" << ' ';
else cout << a << "char" << ' ';
b = getchar();
if(b == '\n') cout << "enter" << ' ';
}
- 输入为123+回车时 打印1 2 3 enter zero,a=getchar()等待输入。fgets自动在末尾添加\0,\n存入了字符数组中,缓冲区内没有内容。
- 输入为1234+回车时 打印1 2 3 4 zero enter。fgets读取了缓冲区中的1234,在末尾添加\0,\n存入了char a中。
- 输入为12345+回车时 打印1 2 3 4 zero 5char enter。此处和cin.getline效果一样,不再赘述。
可见,cin.getline不会读入回车,而是用\0替代,而fgets会读入回车,但第n个字符添加为\0,如果\n是第n+1个字符,会留在缓冲区内。
实验基于Windows VScode。