不使用scanf重新生成以上代码,完成任务内容
时间: 2025-06-26 22:02:57 浏览: 8
如果我们要避免使用 `scanf` 函数,可以考虑利用标准库中的其他输入函数如 `fgets` 配合字符串解析的方式实现类似的功能。下面给出了一种基于 `fgets` 的替代方案,并完成了相同的任务需求。
以下是完整的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // 引入字符串操作头文件
// 定义链表节点
typedef struct LNode {
int data;
struct LNode* next;
} LNode, *Linklist;
int main() {
char buffer[50]; // 输入缓冲区
int k = 0, length = 0; // 初始化长度计数器为 0
Linklist head = (LNode*)malloc(sizeof(LNode)); // 主链表头结点
Linklist evenHead = (LNode*)malloc(sizeof(LNode)); // 存储偶数索引位置的链表头结点
head->next = NULL;
evenHead->next = NULL;
Linklist rear = head; // 主链表尾部指针初始化为主链表头部
Linklist evenRear = evenHead; // 偶数索引链表尾部指针初始指向其头部
printf("请输入链表元素(输入 'exit' 或者空行结束):\n");
while(1){
fgets(buffer, sizeof(buffer), stdin); // 获取一行输入数据
buffer[strcspn(buffer, "\r\n")] = '\0'; // 移除换行符或回车字符
if(strlen(buffer)==0 || strcmp(buffer,"exit")==0){break;} // 判断是否为空或者退出命令 "exit"
sscanf(buffer,"%d",&k); // 将字符串转换为整数形式存放到变量K当中
length++;
// 创建新节点存储数据
LNode* newNode = (LNode*)malloc(sizeof(LNode));
newNode->data = k;
newNode->next = NULL;
if(length % 2 == 1){
rear->next = newNode;
rear = newNode;
}
else{
evenRear->next = newNode;
evenRear = newNode;
}
}
// 连接两条链表,最后一条连接到第一条之后
rear->next = evenHead->next;
// 输出原始链表内容
printf("最终生成的链表:");
for(Linklist p = head->next;p!=NULL;p=p->next){
printf("%d ",p->data);
}
printf("\n");
}
```
在这段代码里我们用到了以下关键技术点:
- 使用了 `fgets()` 函数读取一整行包括空白在内的任意键入序列;
- 调用了 C 标准库函数 `strcspn()` 来定位并且移除可能出现的换行以及回车控制符号;
- 应用了条件分支检查用户是不是提交了一个特殊的停止词汇 `"exit"` 又或者是单纯敲击 Enter 键产生了纯空白响应作为循环终止依据之一;
- 再次借助 `sscanf()` 工具完成从文本串向数字类型的高效转变工作流程;
阅读全文
相关推荐



















