目录
1.字符数组
1.初始化
1.按字符串初始化
2.按字符初始化
2.字符串的输入
1.无空格的字符串
2.带空格的字符串
解决方法
1.gets(了解即可)
gets不安全的原因
2.fgets
3.改良后的scanf
4.getchar
3.字符数组的输出
2.C++万能头
1.字符数组
C语言风格的字符串:用双引号包含的字符串,如printf("Hello World!")
1.初始化
1.按字符串初始化
char arr[]="abcdef";
//或者
char arr[]={"abcdef"};
字符串的末尾有隐藏的\0,具体可以用VS的监视窗口查看
2.按字符初始化
char arr[]={'a','b','c','d','e','f'};
此时没有隐藏的\0
求字符数组的长度:strlen (需要包含<cstring>头文件),具体用法见20.5.【C语言】求长度(sizeof和strlen)的两种方式
2.字符串的输入
1.无空格的字符串
char arr[5];
cin>>arr;
cin>>arr+1;//从arr的第二个元素开始写入
//或者
scanf("%s",arr);
scanf("%s",arr+1);
注:存储字符串时不能越界!
2.带空格的字符串
使用scanf读取会出现问题,遇到空格,scanf会停止读取,问题出在"%s"(详细解释可见文章32.【C语言】详解scanf的7点注意)
使用cin读取也会出现问题,遇到空白字符的时也会停止读取,之后将已经读取到的字符串末尾加上\0
解决方法
1.gets(了解即可)
cplusplus的介绍 点我跳转
gets(由于安全原因不建议用,C++11不支持,建议用fgets!):从标准输入流(stdin)中读取字符串
char * gets ( char * str );
特点:
1.从第一个字符开始读取,一直读取到\n(注意这里不是\0!!!,中途遇到\0会继续读取后面的内容)停止,但不会读取\n,即读取到的内容中没有包含\n
2.在读取到的内容的末尾自动加上\0
char arr[10];
gets(arr);
gets不安全的原因
进入VS2010环境,测试以下代码
#include <iostream>
using namespace std;
int main()
{
char arr[3];
gets(arr);
return 0;
}
窗口输入较长的字符串
因为gets不检查输入字符串的长度,导致输入的字符串可能超过分配给它的缓冲区大小,显然会导致缓冲区溢出!
2.fgets
cplusplus的介绍 点我跳转
fgets:从流中读取字符串
char * fgets ( char * str, int num, FILE * stream );
如果想要读取从键盘键入(stdin)的字符串,写成fgets(数组名,读取的字符个数num,stdin);
注意:
1.fgets从第一个字符开始读取,最多读取num-1个字符,最后一个位置留给\0(和gets一样也会在字符串的末尾补\0),即num包含fgets添加的一个\0
2.如果num的长度是远大于输入的字符串长度,就会一直读取到\n停止,并且会读取\n,将\n 作为读取到内容的一部分,同时在读取到的内容后自动加上\0验证第2点:VS上测试以下代码
#include <iostream> using namespace std; int main() { char arr[15]; fgets(arr, 15, stdin); return 0; }
先下断点至return 0;,之后窗口输入123 456后回车,打开监视窗口查看arr
3.改良后的scanf
scanf("%[^\n]s",arr);
[^\n]表示直到读取到\n才停止读取,不会将\n读取进来,但会在字符串的末尾添加\0
4.getchar
具体参见24.【C语言】getchar和putchar的使用文章
写法1
#include <iostream>
using namespace std;
int main()
{
char arr[10];//没有初始化
char ch;
int i=0;
while ((ch=getchar())!='\n')
{
arr[i]=ch;
i++;
}
arr[i]='\0';//末尾补\0
cout<<arr;
return 0;
}
写法2
#include <iostream>
using namespace std;
int main()
{
char arr[10]={0};//已初始化
char ch;
int i=0;
while ((ch=getchar())!='\n')
{
arr[i]=ch;
i++;
}
cout<<arr;
return 0;
}
特别注意:while ((ch=getchar())!='\n')不能写成while (ch=getchar()!='\n')!!!
赋值运算符的优先级小于!=,会先执行getchar()!='\n'!
3.字符数组的输出
printf或cout或循环逐个打印字符
2.C++万能头(竞赛推荐)
添加#include<bits/stdc++.h>后一劳永逸,不用考虑调用某个函数前需要包含对应的头文件
万能头是以下头文件的集合体
<iostream> <cstdio> <fstream> <algorithm> <cmath> <deque> <vector> <queue> <string>
<cstring> <map> <stack> <set>