linux 下连续使用多个scanf() 的问题和 fflush(stdin)的变通处理

linux 下连续使用多个scanf() 会有问题,实例:


  while (1)
    {
    printf("Please input: ");
    scanf("%s",pstr) ;
    }
 
这段程序运行会出问题,当一次输入后,会不停的提示Please input:,程序不会在scanf等待下一次的输入。
一般资料会说添加fflush函数可解决这个问题:
  while (1)
    {
    printf("Please input: ");
    scanf("%s",pstr) ;
     fflush(stdin); 
    }
 
但是在gcc 版本 4.1.2 20080704 (Red Hat 4.1.2-46)下,fflush函数形同虚设。man fflush有详细的说明可参考。
网络上有人说,在scanf之后使用一个getcahr()可解决,可是,当时输入多个字符还是有问题。
  while (1)
    {
    printf("Please input: ");
    scanf("%s",pstr) ;
     getchar(); 
    }
 
执行结果:

Please input: 1
Please input: 22
Please input: Please input: 333

Please input: Please input: Please input: 4444
Please input: Please input: Please input: Please input: 

 

添加一个循环,问题解决了:

while (1) 
{
    printf("Please input: ");
    scanf("%s",pstr) ;
    while ('/n' != getchar() );
}

   

附一个在网络上查到的另一个解决方法:

#define STR_BUFFSIZE 5
while (1)
   {
    printf("Please input: ");
    scanf("%s",pstr) ;     
    char buffer[STR_BUFFSIZE];
    while( fgets(buffer, STR_BUFFSIZE, stdin) != NULL )
    if(buffer[strlen(buffer)-1] == '/n' )
    }


结论:Linux下C语言连续多个scanf()这么不好用,用gets函数代替如何呢?gets函数也有漏洞!(网络搜索就知道了)

scanf这个现象是如何产生的呢?参考课本是可以有合理的解释。但还是代码说明一切。附一个版本scanf()函数的源代码下载地址: http://ftp.gnu.org/gnu/glibc/glibc-2.0.6.tar.gz 供有心人深入研究吧。


转载:http://blog.youkuaiyun.com/johnphan/article/details/5337509


连续使用两个`scanf`函数时,可能会遇到以下几个问题: 1. **缓冲区溢出**:如果第一个`scanf`未能完全读取预期的内容就跳到了下一个`scanf`,那么剩余的输入可能会超过后续`scanf`处理区域的大小,造成缓冲区溢出。特别是当用户输入的长度大于第二个`scanf`所期望的数据格式时,问题更明显。 2. **未读取完的数据**:如果用户在第一次输入后按下了回车,但第二次`scanf`并未成功匹配所有数据,这部分未读取的数据可能会被丢弃,导致数据丢失。 3. **错误处理缺失**:连续调用可能会忽视错误检查,如格式错误、无效输入等,使得程序难以识别并处理这些问题。 要解决这些问题,可以采取以下措施: 1. **明确预期输入**:每次调用`scanf`之前,应该清楚地知道要获取的数据格式,并设置适当的格式说明符(如`%d`, `%s`等)。 2. **使用错误检测**:对`scanf`的返回值进行检查,看看是否成功读取了所有数据。如果失败(返回值为0),则可能需要提示用户重新输入或处理错误情况。 3. **分批读取**:如果数据量大,可以考虑分多次读取,而不是一次性尝试接收全部数据。 4. **使用fgets`代替`scanf`**:对于文本输入,可以使用`fgets`函数,它可以读取一整个行,避免格式化问题。 ```c char buffer[100]; while (fgets(buffer, sizeof(buffer), stdin)) { // 解析buffer } ``` 通过这些改进,可以提高程序的健壮性用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值