C语言中getchar()函数的作用及缺失影响

在以下代码中,getchar()函数的作用是读取输入的换行符,以防止换行符被接下来的gets()函数误读为输入字符串的一部分。

#include<stdio.h>
#include<string.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    getchar();
    char str[80];
    for(int i=0;i<n;i++)
    {
        int ret=-1;
        gets(str);
        int lenth=0;
        lenth=strlen(str);
        if(str[lenth-1]=='?')
        {
            for(int j=0;j<lenth-2;j++)
            {
                if(str[j]=='P'&&str[j+1]=='T'&&str[j+2]=='A')
                {ret=1;break;}
            }
        }
        else {printf("enen\n");ret=0;}
        if(ret==1) printf("Yes!\n");
        else if(ret==-1) printf("No.\n");
    }
    return 0;
}

如果缺少了getchar()函数, 那么在接下来的gets()函数中,换行符会被误读为输入字符串的一部分。这将导致输入的字符串不符合预期,可能会影响程序的正确性。

例如,当用户输入一个数字后按回车键,scanf()函数会读取数字,但换行符会留在输入缓冲区中。如果接下来调用gets()函数,它会直接读取缓冲区中的换行符,导致实际输入的字符串为空字符串,程序逻辑可能出现错误。

总结: getchar()函数在scanf()之后使用可以清空输入缓冲区中残留的换行符,保证后续gets()函数能够正确读取用户输入的字符串。

建议: 为了避免类似问题,建议使用更安全的输入函数 fgets() 来代替 gets() 函数。fgets() 函数可以指定读取的最大字符数,并不会读取换行符,从而避免了潜在的安全风险。

代码示例:

#include<stdio.h>
#include<string.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    getchar(); // 清空输入缓冲区的换行符
    char str[80];
    for(int i=0;i<n;i++)
    {
        int ret=-1;
        fgets(str, 80, stdin); // 使用fgets()安全读取字符串
        int lenth=0;
        lenth=strlen(str);
        if(str[lenth-1]=='?')
        {
            for(int j=0;j<lenth-2;j++)
            {
                if(str[j]=='P'&&str[j+1]=='T'&&str[j+2]=='A')
                {ret=1;break;}
            }
        }
        else {printf("enen\n");ret=0;}
        if(ret==1) printf("Yes!\n");
        else if(ret==-1) printf("No.\n");
    }
    return 0;
}

原文地址: https://www.cveoy.top/t/topic/pq43 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录