字符串在C++有字符数组和string类两种存在方式,他们的读入和输出方式略有差别,且在读入时,有按行读入和遇空白符终止读入两种形式。
字符数组
- scanf()读入,老朋友了,遇到空白符会终止读入。
#include<cstdio>
int main()
{
char str[100];
scanf("%s", str);
puts(str);
return 0;
}
- cin读入,遇到空白符会终止读入。
#include<cstdio>
#include<iostream>
int main()
{
char str[100];
std::cin >> str;
puts(str);
return 0;
}
-
fgets()读入 ,第一个参数为字符数组的首地址,第二个参数为包括'\0'在内最多可读字节数,第三个参数为文件名(stdin),属于按行读入。
#include<cstdio>
int main()
{
char str[100];
//gets已经被淘汰了
fgets(str, sizeof(str), stdin);
puts(str);
return 0;
}
fgets因换行停止读入字符串时,会在字符串末尾添加'\n'和'\0',若因遇到EOF停止读入,则只会添加'\0'不会添加'\n',所以用的时候可能会产生奇怪的bug。
- cin.getlin()读入,第一个参数为字符数组的首地址,第二个参数为包括'\0'在内最多可读字节数,属于按行读入。
#include<cstdio>
#include<iostream>
int main()
{
char str[100];
//该函数在iostream库中
std::cin.getline(str, 100);
puts(str);
return 0;
}
- 输出字符数组的函数有cout,puts(),printf()三种,使用puts()输出会自动最末尾换行。
string类
- cin读入,遇到空白符会终止读入。
#include<iostream>
int main()
{
std::string str;
std::cin >> str;
std::cout << str;
return 0;
}
- getine()读入,第一个参数我也不懂,第二个参数为变量名,属于按行读入。
#include<iostream>
#include<string>
int main()
{
std::string str;
//该函数在string库中
std::getline(std::cin, str);
std::cout << str;
return 0;
}
cin不会读入回车和空白符,故而会把他们留在缓冲区,如果把cin与其他函数混用(如scanf()、getline()等),可能会有bug,记得清空缓冲区。
- 输出string类可以能用cout,且不会在最末尾处换行;或者调用其成员函数c_str(),视为字符数组输出。