c语言获取终端输入字符串的函数scanf,gets,fgets

简介: c语言获取终端输入字符串的函数scanf,gets,fgets

获取终端输入字符串scanf,gets,fgets

获取终端中输入字符串,我们常用getchar(),scanf(),gets(),和fgets()函数实现,这里简单汇总一下:

scanf() 函数可以获取到终端字符串,但是不能识别到空格字符,遇到空格会终止,空格后面的字符串会在缓冲区中,下次获取时会继续用。

gets()函数以回车字符进行标识,获取用户输入字符串以回车为终止符。

scanf和gets函数都是不安全的,如果目标字符串缓冲区无法存储我们输入的字符串,会导致段错误

fgets()函数限定了获取字符串的长度,如果输入字符串过多,依然可以只获取限定长度的字符串,剩下的字符串还在输入缓冲区中。

测试demo以及输入测试描述:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//scanf输入遇到空格会当成结束符
//gets是遇到回车结束 fgets其实对gets的一些完善扩展
int main()
{
//scanf 读取终端内容时  遇到空格会终止
// 终止后剩余的结果其实还在终端缓冲区中,会在后面读取缓冲区继续生效
  char data[20];
  printf("please test of scanf :\n");
  scanf("%s", data);
  printf("scanf func get data is [%s] \n", data);
  memset(data, 0, 20);
  printf("please test of space scanf :\n");
  scanf("%s", data);
  printf("scanf func get data is [%s] \n", data);
  memset(data, 0, 20);
  fflush(stdin);  //可以刷新缓冲区 一般用在读数据后没读完
//gets可以读取换行前的所有字符,但是gets是不安全的,如无法保证长度越界
  printf("please test of gets \n");
  gets(data);
  printf("gets func get data is [%s] \n", data);
  memset(data, 0, 20);
  printf("please test of space gets :\n");
  gets(data);
  printf("gets func get data is [%s] \n", data);
  memset(data, 0, 20);
//使用fgets函数  对gets函数的扩展,限定了读取数据的长度
  printf("plese test of fgets : \n");
  fgets(data,  20, stdin); //字符串地址  字符串长度   读入的文件   
  printf("fgets func get data is : [%s]", data);
  memset(data, 0, 20);
  printf("please test of len out of 20 fgets:\n");
  fgets(data,  20, stdin);
  printf("fgets func get data is : [%s] \n", data);
  memset(data, 0, 20);
  fflush(stdin);
  return 0;
}
/********************************************
输出的结果:
hlp@ubuntu:~/com_port$ ./in
please test of scanf :   ==>scanf正常输入
12334
scanf func get data is [12334]  ==》打印获取终端的输入
please test of space scanf :  ==》scanf输入带空格的字符串
123 1231 
scanf func get data is [123]    ==》发现只打印了空格前的字符串
please test of gets 
gets func get data is [ 1231 ]  ==》没有经过手动输入, get函数直接获取到终端缓冲区中已经存在的字符串
please test of space gets :   ==》get函数测试带空格的字符串
123 123 412
gets func get data is [123 123 412]  ==》get函数能打印带空格的字符串,终结符以回车为准
plese test of fgets :       ==》测试fget函数获取,在长度内,发现获取到终端内的回车字符
123123 123 1
fgets func get data is : [123123 123 1
]please test of len out of 20 fgets:  ==》如果超过fgets函数参数限制的长度,获取到输入的固定长度字符19个字符
12312 1231231 12312 123123 12312123
fgets func get data is : [12312 1231231 12312]
**************************************************/
/********************************************
可以看出,输入字符串过长,scanf和get函数如果获取长度过多,都会引发段错误
hlp@ubuntu:~/com_port$ ./in
please test of scanf :
1
scanf func get data is [1] 
please test of space scanf :
1
scanf func get data is [1] 
please test of gets 
gets func get data is [] 
please test of space gets :
111111111111111111111111111111111111111111
gets func get data is [111111111111111111111111111111111111111111] 
plese test of fgets : 
12
fgets func get data is : [12
]please test of len out of 20 fgets:
12
fgets func get data is : [12
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
hlp@ubuntu:~/com_port$ ./in
please test of scanf :
111111111111111111111111111111111111111
scanf func get data is [111111111111111111111111111111111111111] 
please test of space scanf :
11111111111111111111111111111111111
scanf func get data is [11111111111111111111111111111111111] 
please test of gets 
gets func get data is [] 
please test of space gets :
1
gets func get data is [1] 
plese test of fgets : 
1
fgets func get data is : [1
]please test of len out of 20 fgets:
1
fgets func get data is : [1
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
**************************************************/
/********************************************
可以看出,输入字符串过长,如果用fget函数进行获取,会在限制长度内获取,下次继续获取缓冲区中剩余字段
hlp@ubuntu:~/com_port$ ./in
please test of scanf :
1
scanf func get data is [1] 
please test of space scanf :
1
scanf func get data is [1] 
please test of gets 
gets func get data is [] 
please test of space gets :
1
gets func get data is [1] 
plese test of fgets : 
1111111111111111111111111111111111111111111111111111111111111111111111111
fgets func get data is : [1111111111111111111]
please test of len out of 20 fgets:
fgets func get data is : [1111111111111111111]
**************************************************/
目录
打赏
0
0
1
0
1
分享
相关文章
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
96 10
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
188 4
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
|
5月前
|
【C语言基础考研向】05 scanf读取标准输入超详解
本文详细解析了C语言中`scanf`函数的工作原理及常见问题。首先介绍了`scanf`如何处理标准输入,并通过示例说明了为何有时会出现阻塞现象及其解决办法。接着探讨了当输入包含多种数据类型时,特别是字符型数据的处理方式,强调了格式控制的重要性,并给出了正确的输入格式示例。通过正确配置,可以避免因空格和换行符导致的问题,确保数据准确读取。
150 10
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
148 8
|
4月前
|
初识C语言:与计算机的交流之输入与输出(scanf和printf)
初识C语言:与计算机的交流之输入与输出(scanf和printf)
334 0
C语言 gets()和scanf()函数的区别
scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别。若想从键盘上输入字符串"hi hello",则应该使用 gets 函数。 gets可以接收空格;而scanf遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格。
1238 0
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
66 23
|
1月前
|
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
72 15
|
1月前
|
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
61 24

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等