C语言::90%的人都没法解决scanf()函数的这些问题 - 高小调博客

C语言::90%的人都没法解决scanf()函数的这些问题

scanf()函数也是我们在C语言中常用的函数。在大多数情况下,scanf()函数都能满足我们的需求,但是scanf()函数在使用的过程中也有诸多问题,比如说,下面的这些问题......

问题一:如何让scanf()函数正确接受有空格的字符串?

1
2
3
4
5
6
7
8
#include <stdio.h>
int main(void)
{
    char str[20];
    scanf("%s",str);
    printf("%s",str);
    return 0;
}

上述代码中,如果我们想让str接受到“Hello World!”时,却发现最终str只能接受到“Hello”。

如何解决这样的问题?

问题二:如何解决因输入类型与格式化字符串不匹配而导致的死循环

1
2
3
4
5
6
7
8
#include<stdio.h>
int main(){
    int i = 1;
    while(i){
        printf("按任意键继续输出,按0退出输出!\n");
        scanf("%d",&i);
    }
}

上述代码中,如果我们输入@!$%或abcd等非整数类型值时,程序就会陷入死循环。

如何解决这样的问题?

问题一:解答

scanf()函数中,当扫描到空格时,就以为已经结束了,因此忽略了后 面“World!”字符。因此,我们可以这样来改动程序:

1
2
3
4
5
6
7
8
#include <stdio.h>
int main(void)
{
    char str[20];
    scanf("%[^\n]",str);
    printf("%s",str);
    return 0;
}

%[]表示扫描的集合。其中%[^\n]是代表不遇到换行符不结束。

因此,就这样简单的操作,轻松的解决了使scanf()函数正确接受有空格的字 符串的问题

问题二:解答

当输入内容与格式换字符串不匹配时,stdin流会被阻塞,键盘缓冲区会存在残余信息,因此程序变成了死循环。

我们仅需对程序做这样的一个小改动,程序就会恢复正常:

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main(){
    int i = 1;
    while(i){
        printf("按任意键继续输出,按0退出输出!\n");
        scanf("%d",&i);
        fflush(stdin);  //清空输入缓冲区
    }
}

通过fflush()这样一个简简单单的函数,就彻底的解决了由scanf()函数造成 的程序死循环的问题。

这就是本期关于scanf()函数的补充内容,下次再见!

如果你还不知道scanf()函数是什么?你会不由自主的想->点击这里<-的。

今天也要努力......

上一篇:
下一篇: