scanf到底有多麻烦

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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值