C语言通过管道从标准输入读取内容时如何跳过首行?
实现方案
核心逻辑说明
- 第一步:直接读取并丢弃stdin的第一行内容,完成表头跳过
- 第二步:循环读取后续每一行的字段,解析后存入链表节点
- 第三步:按需求处理链表,最后释放内存避免泄漏
完整代码示例
#include <stdio.h> #include <stdlib.h> #include <string.h> // 可根据你实际定义的结构体调整字段 typedef struct Student { char name[32]; char grade[4]; float points; float average; struct Student* next; } Student; // 跳过单行内容,适配任意长度的表头 void skip_one_line(FILE* fp) { int c; while ((c = fgetc(fp)) != '\n' && c != EOF); } // 创建新的链表节点 Student* create_student_node(char* name, char* grade, float points, float average) { Student* node = malloc(sizeof(Student)); if (node == NULL) { perror("节点内存申请失败"); exit(EXIT_FAILURE); } strcpy(node->name, name); strcpy(node->grade, grade); node->points = points; node->average = average; node->next = NULL; return node; } int main() { // 跳过表头行 skip_one_line(stdin); Student *head = NULL, *tail = NULL; char name_buf[32], grade_buf[4]; float points_val, average_val; // 循环读取后续所有有效数据行 while (fscanf(stdin, "%s %s %f %f", name_buf, grade_buf, &points_val, &average_val) == 4) { Student* new_node = create_student_node(name_buf, grade_buf, points_val, average_val); // 尾插法插入链表 if (head == NULL) { head = new_node; tail = new_node; } else { tail->next = new_node; tail = new_node; } } // 此处可添加你自己的链表业务逻辑,示例为遍历打印 Student* iter = head; while (iter != NULL) { printf("%s %s %.1f %.1f\n", iter->name, iter->grade, iter->points, iter->average); iter = iter->next; } // 释放链表内存 iter = head; while (iter != NULL) { Student* temp = iter; iter = iter->next; free(temp); } return EXIT_SUCCESS; }
使用说明
- 编译代码后直接使用你提供的命令格式调用即可:
./codename < input.txt,不需要修改代码中的读取路径,默认适配标准输入重定向场景 - 如果你的
Name字段包含空格,将fscanf读取逻辑替换为fgets读整行后按分隔符拆分即可 fscanf会自动跳过字段之间的任意空白符(多空格、制表符、换行符),不需要额外处理格式问题
内容的提问来源于stack exchange,提问作者compscinewb
相关产品推荐
相关产品推荐

