1.scanf()
scanf()在输入字符串时有很大的弊端, 例如:
1). scanf()在从键盘读入字符时并不会根据所定义的字符数组的大小来控制读入多少个 , 而是从scanf( ) 中传入的地址开始一直访问下一个元素的内存 , 碰见空格符或者回车符时才停止读入并存入结束符’\0’ , 这就有可能造成了一个在C中非常严重的问题 , 访问非法内存 . 如果所输字符数量大于字符数组的长度 , 当scanf()将把字符存入字符数组的最后一个元素后 , scanf()还会继续往后访问内存 , 将接收的字符继续存入 , 但之后的内存是我们未申请的非法内存 , 会发生未知错误 ,。
解决方法:
1。清空输入缓冲区
第一个scanf后加入语句:fflush(stdin); //C语言清空输入缓冲区函数
2。格式控制中加入空格
将第二个scanf改为:scanf(" %c",&ch2);//在%号前面加一个空格
scanf格式输入时要求输入格式与格式控制符中的完全一样(如:scanf(“abcd%c”,&ch);输入时必须输入abcde,ch得到的值为e)空格可以抵消前面输入的回车符。
2). 第二点也就是第一点中的遇到空格符停止读入并存入结束符’\0’, 也就是说scanf()存不了空格符
解决方法:
scanf("%[^\n]",&a);
**3)**输入多个字符串
//方法一:直接定义字符串数组
#include<stdio.h>
int main(){
int len = 100;//len是每个字符串最大的长度
//输入字符串的个数
int n;
scanf("%d", &n);
//定义字符串数组
char p[n][len];
//读入字符串数组
for(int i = 0; i < n; i++){
scanf("%s", &p[i][0]);
}
//输出字符串数组
for(int i = 0; i < n; i++){
printf("%s \n", &p[i][0]);
}
return 0;
}