目录/持续更新中ing
C++中的输入输出
C++基本输入输出语句
cin (标准输入流)
cin
可以输入数字,字符和字符串,但是遇到空格
和回车
就结束接受输入的数据。 cin
是 iostream
类的一个实例。
例:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
cin>>s;
cout<<s;
return 0;
}
输入输出结果:
cout (标准输出流)
C++ 编译器根据要输出变量的数据类型,选择合适的流插入运算符来显示值。 cout
是 iostream
类的一个实例。
输出示例如上例。
C++输入语句
gets()
gets()
是在C语言中的函数,在C++中也可以使用,但是在某些编译器中会存在有bug。
例:
#include <iostream>
using namespace std;
int main(){
char s[20];
gets(s);
cout<<s;
return 0;
}
注意:其中的s的类型只能是char
数组类型的字符串,不能是string
类型的字符串。
运行结果:
(两次运行相同的代码,运行结果不相同,原因未明)
getchar()
getchar()
函数的作用是从标准的输入stdin
中读取字符。
例:
//判断输入的是否为回车
if(getchar()=='\n'){
break;
}
getline()
若定义变量为string类型,则要考虑getline()
函数。getline()
函数可以接收空格,但是数据类型应为string
类型。
getline()有两种用法(参考):
istream& getline ( istream &is , string &str , char delim );
istream& getline ( istream &is , string &str );
is
进行读入操作的输入流
str
用来存储读入的内容
delim
终结符,遇到该字符停止读取操作,不写的话默认为回车
例1:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
getline(cin,s);
cout<<s;
return 0;
}
运行结果:
这里没有设置停止符,所以默认回车停止。
例2:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
getline(cin,s,'!');//以!为结束符
cout<<s;
return 0;
}
运行结果:
从运行结果可以看到,我们输入了回车键,但是并没有结束输入,直到输入了’!'才结束了输入;从输出结果我们可以看到,最后是输出了一个换行符的,说明换行符也当作了一个字符存入了字符串中。
C++输出语句
put()
put()
是iostream
类的成员函数,功能是将一个字符写入文件。
putchar()
putchar
函数的参数的类型是int
,表示待输出的字符的ASCII
码。65就是字符A的ASCII码,也就是’A’。putchar(65);等同于putchar(‘A’);都是输出字符A。
例:
#include <iostream>
using namespace std;
int main(){
putchar(65);
return 0;
}
运行结果:
参数为整型且为ASCII码。
输入未知长度数组
vector
vector(向量): C++中的一种
数据结构
,确切的说是一个类
。它相当于一个动态的数组
,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的。(参考)
源程序中需要添加#include <vector>
,当然,必须还要有using namespace std;
方法:
- push_back 在数组的最后添加一个数据
- pop_back 去掉数组的最后一个数据
- at 得到编号位置的数据
- begin 得到数组头的指针
- end 得到数组的最后一个单元+1的指针
- front 得到数组头的引用
- back 得到数组的最后一个单元的引用
- max_size 得到vector最大可以是多大
- capacity 当前vector分配的大小
- size 当前使用数据的大小
- resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
- reserve 改变当前vecotr所分配空间的大小
- erase 删除指针指向的数据项
- clear 清空当前的vector
- rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
- rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
- empty 判断vector是否为空
- swap 与另一个vector交换数据
简单用例:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(){
vector <int> array;//定义一个整型数组
int x,count;
int M,sum=0;
for(int i=0;;i++){
cin>>x;
array.push_back(x);//在后面添加输入的数
count++;
if(getchar()=='\n'){
break;
}
}
cin>>M;
for(int i=0;i<count;i++){
for(int j=i+1;j<count;j++){
if(array[i]+array[j]<=M){
sum++;
}
}
}
cout<<sum;
return 0;
}
vector
的初始赋值是使用的array.push_back(x)
,初始赋值不可以使用=
直接赋值,赋值之后可以使用=
更改数组的值。
头文件<string.h>
、<cstring>
和<string>
的区别
#include<string.h>
是C语言的标准库,主要是对字符串进行操作的库函数,是基于char*进行操作的,包含比如strcpy
、strcat
之类的字符串处理函数。
#include<cstring>
在C++标准化(1998年)过程中,为了兼容以前,标准化组织将所有这些文件都进行了新的定义,加入到了标准库中,加入后的文件名就新增了一个"c"前缀并且去掉了.h的后缀名,所以string.h头文件成了cstring头文件。
#include<string>
是C++标准定义的头文件,它定义了一个string
的字符串类,里面包含了string
类的各种操作,如s.size()
,s.erase()
,s.insert()
等。但<string>
又包含了老的C版本的字符串操作如strcpy
、strcat
等,这就相当于,在<string>
的文件中除了定义自己的string
类之外,还加了一个#include<string.h>
一句包含了C版本的字符串操作。(但在实操当中,我试过strcat()函数还是需要引入<string.h>
头文件,可能是编译器的问题?)
<string.h>部分函数
strcat()
C
库函数 char *strcat(char *dest, const char *src)
把 src
所指向的字符串追加到 dest
所指向的字符串的结尾。
dest
指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。src
指向要追加的字符串,该字符串不会覆盖目标字符串。
例:
int main(){
char s1[]="this is my string!";
char s2[]="attention ";
strcat(s2,s1);//将s1的字符串连接到s2后面
cout<<s2;
return 0;
}
运行结果:
strncat
C
库函数char *strncat(char *dest, const char *src, size_t n)
把src
所指向的字符串追加到dest
所指向的字符串的结尾,直到n
字符长度为止。
dest
指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。src
要追加的字符串。n
要追加的最大字符数。
例:
int main(){
char s1[]="this is my string!";
char s2[]="attention ";
strncat(s2,s1,4);//将s1的4个字符串连接到s2后面
cout<<s2;
return 0;
}
运行结果:
strcmp
C
库函数int strcmp(const char *str1, const char *str2)
把str1
所指向的字符串和str2
所指向的字符串进行比较。
- 如果返回值小于 0,则表示 str1 小于 str2。
- 如果返回值大于 0,则表示 str1 大于 str2。
- 如果返回值等于 0,则表示 str1 等于 str2。
例:
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[15];
char str2[15];
int ret;
strcpy(str1, "abcdef");
strcpy(str2, "ABCDEF");
ret = strcmp(str1, str2);
if(ret < 0)
{
printf("str1 小于 str2");
}
else if(ret > 0)
{
printf("str1 大于 str2");
}
else
{
printf("str1 等于 str2");
}
return(0);
}
运行结果:
strcpy
C
库函数char *strcpy(char *dest, const char *src)
把src
所指向的字符串复制到dest
。也有另一种使用方法int strncmp(const char *str1, const char *str2, size_t n)
把str1
和str2
进行比较,最多比较前n
个字节。同上。
需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。
dest
指向用于存储复制内容的目标数组。src
要复制的字符串。
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
int main(){
char s1[]="this is my string!";
char s2[]="attention ";
strcpy(s2,s1);//将s1的字符串复制到s2
cout<<s2;
return 0;
}
运行结果:
将持续更新,敬请关注!