目录
scanf 与 cin 的常见问题
当输入不含空格的字符串时,cin 与 scanf 不会出现问题
但当输入含空格的字符串时
scanf
int main()
{
char arr[10] = { 0 };
scanf("%s",arr);
printf("%s",arr);
return 0;
}
由上述代码可知,当读取到空格时,会直接终止读取。
占位符:%s
不等同于字符串。它的规则是 从当前第一个非空字符串开始读取,直至遇到空白字符(空格,换行,制表符)为止。正因为%s不会包含空白字符,所以无法用来读取多个单词等中间含有空白字符的情况,除非多个%s同时用。注意当scanf() 遇到%s等占位符时,会自动在结尾添加一个 '\0'。
上图在输入时值只输入了abc,但在字符串的结尾处自动加上了'/0'。
在vs2022中现在已经不让用scanf的原因就是,scanf在将字符串读入字符数组时,不会检查字符串是否超出了数组的长度。所以 存储字符串时,很可能会超出数组的边界。
那如何解决上述中使用%s 时出现的不安全的状况呢?
使用%s占位符时,可以指定读入字符串的最长的长度,即写成 %[^m]s ,其中的[m]是一个数字,表示读取一个字符串最大的长度,其后的都会被丢掉。
char arr[11] = { '/0' };
scanf("%10s",arr);
cin
cin与scanf相同。
其实cin在读取⼀个字符串的时候,在遇到空⽩字符的时候,就认为字符串结束了,不再继续 往后读取剩余的字符,同时将已经读取到的字符串末尾加上\0,直接存储起来。
如何解决输出中含有空格的情况
1.使用gets()与fgets()
1. char * gets ( char * str );
2. char * fgets ( char * str, int num, FILE * stream );
1. gets 是从第⼀个字符开始读取,⼀直读取到 \n 停⽌,但是不会读取 \n ,也就是读取到的内容 中没有包含 \n ,但是会在读取到的内容后⾃动加上 \0 。
2. fgets 也是从第⼀个字符开始读取,最多读取 num-1 个字符,最后⼀个位置留给 \0 ,如果 num 的⻓度是远⼤于输⼊的字符串⻓度,就会⼀直读取到 \n 停⽌,并且会读取 \n ,将 \n 作 为读取到内容的⼀部分,同时在读取到的内容后⾃动加上 \0 。
//方法一
#include<cstdio>
int main()
{
char arr[10];
gets(arr);
printf("%s",arr);
}
//方法二
#include<cstdio>
int main()
{
char arr[10];
fgets(arr,sizeof(arr),stdin); // 此处的stdio是标准输入流,指从键盘输入
printf("%s",arr);
}
注意:在某些编译器上现在无法使用gets(),不过并不影响,推荐使用fgets()。
2.使用scanf()
C语言中的scanf()函数也能实现读取中间的空格,便是使用特定的格式
将 "%s" 改成 "%[^\n]s"
这种输入格式会一直读取输入,直到遇到 \n 后停止,这样即便遇到了空格也不会影响.
上述方式不会把 \n 读取进来,但是会在字符串末尾加上 '\0'
3.getchar()
注意getchar()的返回值类型是 int
使用getchar() 一个字符一个字符的读取,也可以读取字符串。