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()方法

猜你喜欢

转载自blog.csdn.net/Cristiano_san/article/details/106481209