【C语言】输入函数getchar函数,scanf函数,gets函数的区别

C语言中输入函数

scanf函数,getchar函数,getch函数,gets函数解析

scanf函数与getchar函数的区别

scanf函数:

包含于头文件<stdio.h>中
scanf函数功能
函数 scanf() 是从标准输入流stdin (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。
scanf函数使用


#include <stdio.h>

void main( void )
{
   int   i, result;
   float fp;
   char  c, s[81];
   printf( "\n\nEnter an int, a float, two chars and two strings\n");
   result = scanf( "%d %f %c %C %s %S", &i, &fp, &c, &wc, s, ws );
   printf( "\nThe number of fields input is %d\n", result );
   printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c, wc, s, ws);
}

scanf函数从标准输入设备(键盘)所输入的标准输入流中读取数据并把数据写入参数给出的指定位置 。每个参数都必须是一个指向变量类型的指针,即和格式说明符类型相匹配的指针。如果赋值字符串之间发生重叠,则为未定义行为。

getchar函数

包含于头文件<stdio.h>
getchar函数功能
getchar函数的使用

#include <stdio.h>
void main( void )
{
   char buffer[81];
   int i, ch;
   printf( "Enter a line: " );
   /* Read in single line from "stdin": */
   for( i = 0; (i < 80) &&  ((ch = getchar()) != EOF) 
                        && (ch != '\n'); i++ )
      buffer[i] = (char)ch;
   /* Terminate string with null character: */
   buffer[i] = '\0';
   printf( "%s\n", buffer );
}

getchar是读入函数的一种。它从标准输入里读取下一个字符,相当于getc(stdin)。返回类型为int型,为用户输入的ASCII码或EOF。

gets函数

gets函数功能
从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。
gets函数的使用

#include <stdio.h>

int main( void )
{
   char line[81];
   printf( "Input a string: " );
   gets( line );
   printf( "The line entered was: %s\n", line );
}
getchar函数与scanf函数的区别
scanf函数,getchar函数输入原理

1.程序的输入都建有一个缓冲区,即输入缓冲区。输入过程:当一次键盘输入结束回车时会将输入的数据存入输入缓冲区(包括回车符),而c函数直接从输入缓冲区中读取数据。
2.c函数是直接从缓冲区取数据的,当缓冲区中有残留数据时,c函数会直接取得这些残留数据而不会请求键盘输入,如果当缓存区中只要有字符(包括回车,空格,tab键),均会读取。

scanf函数,getchar函数区别

1.从缓冲区读取数字,若缓冲区中没有数字,则等待从键盘进行输入,回车触发scanf读取,并没有读取\n。(后面可执行getchar时,直接从缓冲区中读取\n.) 2.代码中使用 getchar()处理字符输入,用 scanf () 处理数字输入。 getchar () 读取一个字符,包括空格、制表符和换行符; 而 scanf()在读取数字时则会跳过空格、制表符和换行符。(空格,制表符就是tab\t换行符就是回车\n),scanf中若读取字符串,不能读取空格,回车,制表符。若读取单个字符%c,可读取空格和制表符,不能读取回车。

#include<stdio.h>
int main()
{
	#include<stdio.h>
int main()
{
    char password[20] = { 0 };
    printf("请输入密码:>");
    scanf("%s", password);
    printf("请确认密码(Y/N):>");
    char ch = getchar();
    if (ch == 'Y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("确认失败\n");
    }
	return 0;
}
}

如上代码中,scanf函数中键入了一个\n,此时直接显示确认失败,缓存区中存在\n,ch读取到的是\n,进入if语句直接判断失败。修改代码

#include<stdio.h>
int main()
{
    char password[20] = { 0 };
    printf("请输入密码:>");
    scanf("%s", password);
    printf("请确认密码(Y/N):>");
    getchar();
    char ch = getchar();
    if (ch == 'Y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("确认失败\n");
    }
	return 0;
}

此时,运行此代码,由于getchar已经将缓存区中的\n清理,所以此时可正常输入字符进入if判断。

getch函数,getchar函数的区别:
getchar函数

getchar可用宏实现:#define getchar() getc(stdin)。getchar有一个int型的返回值。当程序调用getchar时.程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符。getchar函数的返回值是用户输入的字符的ASCII码,若文件结尾(End-Of-File)则返回-1(EOF),且将用户输入的字符回显到屏幕。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键。

getch函数

getch与getchar基本功能相同,差别是getch直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回,getch返回值是用户输入的ASCⅡ码,出错返回-1。输入的字符不会回显在屏幕上.getch函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继续运行。

scanf函数,gets函数区别
    int main()
    {
           char str1[20], str2[20];
           scanf("%s",str1); 
           printf("%s\n",str1);    
           scanf("%s",str2);  
           printf("%s\n",str2);  
           return 0;
    }
输入:hello world
输出:hello
     world
scanf函数

同上,scanf()读取字符串会舍弃最后的回车符!scanf来读取一个字符串时,字符串中是不可以出现空格的,一旦出现空格,后面的数据就会舍弃残留在缓冲区中。

gets函数
int main()
{
       char str1[20], str2[20];
       gets(str1); 
       printf("%s\n",str1);    
       gets(str2);  
       printf("%s\n",str2);  
       return 0;
}

gets()函数读取到\n(我们输入的回车)于是停止读取,但是它不会把\n包含到字符串里面去。和它配合使用的puts函数,却在输出字符串的时候自动换行。
由于可以无限读取,易发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。可使用fgets函数替换。与gets相比使用这个好处是:读取指定大小的数据,避免gets函数从stdin接收字符串而不检查它所复制的缓存的容积导致的缓存溢出问题。

总结

1.读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,不会舍弃最后的回车符;
2.读取字符串时:
scanf()以Space、Enter、Tab结束一次输入
gets()以Enter结束输入,接受空格,会舍弃最后的回车符!
3:清空缓冲区
方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!函数是fflush(stdin)。
方法2:自己取出缓冲区里的残留数据。
​ scanf(“%[^\n]”,string);–正则表达式(不懂)。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Miraitowax

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值