C语言字符串之scanf()输入与gets()输入的比较

我们以这道题为例:
在这里插入图片描述
这道题要求我们用链表实现学生信息的存储
一般来说我们会这么实现:
1、创建一个结构体,为所有的信息定义一个数据类型
在这里插入图片描述
2、输入信息的时候用scanf()函数分别录入信息
在这里插入图片描述
但是这会存在一个问题,题目中的输入要求的最后一句话**“end”**字符串很难输入进去,从而使输入结束执行

那么,怎么办呢?
我们就用gets()函数去实现输入
1、我们只定义一个字符串,将所有的信息都存进去
在这里插入图片描述
2、使用gets()函数,每次只要输入一个字符串就可以
在这里插入图片描述
这样的话我们就可以在输入**“end”**以后进行判断,从而结束输入
下面是这个题目的源代码:

#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct StuNode{
	char Information[200]; 
	struct StuNode* next; 
}Student,*Link;
Link CreateList(){
	Link headnode = (Link)malloc(sizeof(Student));
	headnode->next = NULL;
	return headnode;
}//创建链表
Link CreateNode(char Information[200]){
	Link NewNode = (Link)malloc(sizeof(Student));
	strcpy(NewNode->Information,Information);
	return NewNode;
}//创建节点
int InsertNode(Link headnode){
	char Information[200]; 
	gets(Information);
	if(strcmp(Information,"end")!=0){
		Link newnode = CreateNode(Information);
		newnode->next = headnode->next;
		headnode->next = newnode;
		return 0;
	}else if(strcmp(Information,"end")==0){
		return 1;
	}
}//插入结点
void Print(Link headnode){
	Link PrintNode = headnode->next;
	if(headnode == NULL){
		printf("没有学生信息");
		return ;
	}
	while(PrintNode != NULL){
		puts(PrintNode->Information);
		PrintNode = PrintNode->next;
	}
}//输出结点
int main(){
	Link headnode = CreateList();
	while(1){	
		int i = InsertNode(headnode);
		if(i == 0)
			continue;
			
		else if(i == 1)
			break;
	}
	Print(headnode);
	return 0;
} 

(可能代码有些冗长,代码仅供参考,若是有同学没有明白,请在评论区回复)

正文部分:
字符串之scanf()函数与gets()函数的比较:
1、我个人而言,scanf()适用于同时对多个不同类型的数据的输入,且在之后的操作中不同数据类型之间的不相关性很强,就如上面的题目,我有时要操作学生信息中的年龄或成绩**(一般来说建议用这个函数)**
2、gets()函数适用于只对一个字符串整体进行操作,就比如上面的题目,我只需要输入一个字符串并对这个串进行判断继续输出还是终止,这样就方便了操作。
3、如果题目的意思是让你输入一个语句结束程序,比如上面的让你输入**“end”**结束语句,一般用gets()方法

scanfgets都是C语言中常用的输入函数,但它们在使用上有一些区别。 scanf是格式化输入函数,可以按指定的格式从标准输入流(通常是键盘)读取数据。它的使用方式是通过格式字符串来指定输入的数据类型和格式,并且可以使用多个格式字符串来读取多个输入。例如,可以使用"%d"来读取一个整数,"%f"来读取一个浮点数,"%s"来读取一个字符串等。scanf函数会跳过输入中的空格、制表符和换行符,直到读取到有效的输入为止。然而,scanf函数存在一些安全性问题,因为它无法控制输入的长度,可能导致缓冲区溢出。 gets是一种不安全的输入函数,它可以从标准输入流读取一行字符串,并将其存储在指定的字符数组中。gets函数会读取输入中的所有字符,包括空格、制表符和换行符,直到遇到换行符为止。然而,gets函数没有办法检查输入数据的长度,可能导致缓冲区溢出。因此,在实际使用中,不推荐使用gets函数。 为了更安全地读取字符串,推荐使用fgets函数。fgets函数可以指定读取的最大字符数,避免了缓冲区溢出的问题。使用fgets函数时,需要注意将换行符也纳入考虑,因为它会被读取到并存储在字符串中。 综上所述,scanfgets的主要区别在于输入方式和安全性。scanf是格式化输入函数,gets是一次性读取一行字符串的函数,而fgets是更安全的读取字符串函数。在实际使用中,应尽量避免使用不安全的输入函数gets
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值