【C语言天天练(十五)】字符串输入函数fgets、gets和scanf

简介:

引言:假设想把一个字符串读到程序中。必须首先预留存储字符串的空间。然后使用输入函数来获取这个字符串。


读取字符串输入的第一件事是建立一个空间以存放读入的字符串。

char *name;

scanf("%s", name);

这段代码尽管可能通过编译,但由于name能够指向不论什么地方,所以它的输入值可能覆盖曾经name所指位置的值。

解决的方法是声明一个固定大小的字符数组,或者使用C库里的分配存储空间的函数


1、gets函数从系统标准输入获得一个字符串。读取字符串直到遇到一个换行符(\n)。它读取换行符之前的全部字符。在这些字符后加入一个空字符(\0),然后把这个字符串交给调用它的程序。它把读取的换行符直接丢弃。而不是把它放入字符串中,这与以下讨论的fgets函数不同,以下再给出样例证明这一点。

#include <stdio.h>

char *gets(char *s);

演示样例:

#include <stdio.h>


#define MAX 18


int
main(int argc, char **argv)
{
	char name[MAX];
	char *ptr;
	printf("what't your name?\n");
	ptr = gets(name);		/*注意:gets()返回的指针与传递给它的是同一个指针*/
	printf("%s?

Ah ! %s\n", ptr, name); return 0; }

注意,假设gets出错时它返回一个空地址,因此在使用时一般使用例如以下技巧:

while((ptr = gets(name)) != NULL){
……
}


2、gets函数的一个不足是它不检查预留存储区是否可以容纳实际输入的数据。多出来的字符简单地溢出到相邻的内存区。fgets()函数改进了这个问题。它可以指定最大读入字符数。fgets()和gets()有3点不同:

a、它须要第二个參数来说明组大读入字符数。

假设这个參数值为n,fgets()就会读取最多n-1个字符或者读完一个换行符为止。

b、假设fgets读取到换行符。就会把它存放在字符串里。而不是像gets()那样丢弃它。也就是说它在字符串的最后存放的是换行符(\n),而不是空字符(\0)。

c、它还须要第三个參数来说明读哪一个文件。

#include <stdio.h>

char *fgets(char *s, int size, FILE *strem);

演示样例

#include <stdio.h>

#define MAX 18

int
main(int argc, char **argv)
{
	char name[MAX];
	char *ptr;
	printf("what't your name?

\n"); ptr = fgets(name, MAX, stdin); printf("%s? Ah ! %s\n", ptr, name); return 0; }

编译測试结果显示:

what't your name?
libing
libing
? Ah ! libing
它显示了fgets()的一个不足之处,fgets()把换行符存储到字符串里了。这样每次显示字符串时就会显示换行符。


以下对fgets()和gets()两个函数对于换行符不同处理的演示样例证明:

#include <stdio.h>

#define MAX 18

int
main(int argc, char **argv)
{
	char name1[MAX];
	char name2[MAX];
	char *ptr;
	printf("what't your name?\n");
	ptr = fgets(name1, MAX, stdin);
	ptr = gets(name2);
	if(strcmp(name1, name2)){<span style="white-space:pre">	</span>/*比較两个字符串,由于gets会在最后将\n改为\0存入字符串,而fgets会直接将\n存入字符串*/
		printf("name1 is not equal name2\n");	
	}
	return 0;
}

3、scanf()和gets()基本的区别在于它们假设决定字符串何时结束。scanf()更给予获取单词而不是获取字符串;而gets()函数,会读取全部的字符,直到遇到第一个换行符为止。scanf()使用两种方法决定输入结束。假设使用%s格式。字符串读到下一个空白字符。假设指定了字段宽度,比方%10s,scanf()就会读入10个字符或直到遇到第一个空白字符。由二者中最先满足的哪一个终止输入。

#include <stdio.h>

int
main(void)
{
	char name1[11], name2[11];
	int count;

	while(1){
		printf("please input 2 names.\n");	
		count = scanf("%5s %10s", name1, name2);
		printf("I read the %d names %s and %s.\n"
						,count, name1, name2);

	}
	return 0;
}
执行执行測试:

please input 2 names.
Jesse Jukes
I read the 2 names Jesse and Jukes.
please input 2 names.
Liza Applebottham
I read the 2 names Liza and Applebotth.
please input 2 names.
Portensia Callowit
I read the 2 names am and Portensia.
please input 2 names.
I read the 2 names Callo and wit.








本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5141676.html,如需转载请自行联系原作者


相关文章
|
10月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1549 0
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
509 15
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
669 1
一文彻底搞清楚C语言的函数
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
729 3
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
965 2
|
存储 编译器 C语言
在C语言中的数组和字符串
在C语言中的数组和字符串
|
存储 机器学习/深度学习 Linux
【C语言】语言篇——数组和字符串
【C语言】语言篇——数组和字符串
193 0
|
存储 C语言
C语言之指针(指针数组以及指针的指针和字符串)
C语言之指针(指针数组以及指针的指针和字符串)
394 0
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
819 8
|
安全 C语言
C语言8 数组与字符串
C语言8 数组与字符串
194 0