C语言memmove库.h文件
时间: 2024-01-15 21:02:39 浏览: 72
在C语言中,`memmove`函数用于在内存中移动一段数据。它的函数原型声明在 `<string.h>` 头文件中,而不是在一个单独的库文件中。以下是`memmove`函数的函数原型声明:
```c
void *memmove(void *dest, const void *src, size_t n);
```
这个函数的作用是将 `src` 指针指向的内存块中的数据移动到 `dest` 指针指向的内存块中,移动的数据大小为 `n` 字节。与 `memcpy` 函数不同的是,`memmove` 函数能够正确处理内存块重叠的情况。
要使用 `memmove` 函数,你需要包含 `<string.h>` 头文件,并通过链接器链接相应的标准库。
相关问题
要求用C语言编写:1.先编写一个带结构的文件,存入电脑,要求第一行从左到右的内容依次是:姓名、地址、学号,每排每列对齐,没有对齐的地方用空格补齐。2.从电脑中能够读入这个带结构的文件,并进行删增改后,重新存入电脑,3.这个文件要有纵横结构,每横表示一个记录4. 编出来的代码要能够后续的插入、删除和修改
好的,我理解了你的问题。以下是一个简单的 C 语言程序,可以实现你要求的功能。程序中使用了结构体数组来存储学生的信息,使用文件来读写数据。具体实现细节可以根据需要进行调整。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 100
#define MAX_NAME_LEN 20
#define MAX_ADDR_LEN 50
#define MAX_ID_LEN 10
typedef struct {
char name[MAX_NAME_LEN];
char addr[MAX_ADDR_LEN];
char id[MAX_ID_LEN];
} Student;
void print_header()
{
printf("姓名 地址 学号\n");
printf("---------------------------------------------------------------------------------------\n");
}
void print_student(const Student* s)
{
printf("%-20s%-50s%-10s\n", s->name, s->addr, s->id);
}
void load_students(Student students[], int* num_students)
{
FILE* fp = fopen("students.dat", "rb");
if (!fp) {
printf("读取文件失败!\n");
*num_students = 0;
return;
}
*num_students = 0;
while (fread(&students[*num_students], sizeof(Student), 1, fp) == 1) {
(*num_students)++;
}
fclose(fp);
}
void save_students(const Student students[], int num_students)
{
FILE* fp = fopen("students.dat", "wb");
if (!fp) {
printf("写入文件失败!\n");
return;
}
fwrite(students, sizeof(Student), num_students, fp);
fclose(fp);
}
int find_student(const Student students[], int num_students, const char* id)
{
int i;
for (i = 0; i < num_students; i++) {
if (strcmp(students[i].id, id) == 0) {
return i;
}
}
return -1;
}
void add_student(Student students[], int* num_students)
{
if (*num_students >= MAX_STUDENTS) {
printf("学生记录已满,无法添加新记录!\n");
return;
}
Student s;
printf("请输入学生信息(姓名 地址 学号):");
scanf("%s %s %s", s.name, s.addr, s.id);
if (find_student(students, *num_students, s.id) >= 0) {
printf("学号 %s 已存在,无法添加新记录!\n", s.id);
return;
}
students[*num_students] = s;
(*num_students)++;
printf("添加成功!\n");
}
void remove_student(Student students[], int* num_students)
{
char id[MAX_ID_LEN];
printf("请输入要删除的学生的学号:");
scanf("%s", id);
int idx = find_student(students, *num_students, id);
if (idx < 0) {
printf("学号 %s 不存在,无法删除记录!\n", id);
return;
}
memmove(&students[idx], &students[idx+1], (*num_students-idx-1)*sizeof(Student));
(*num_students)--;
printf("删除成功!\n");
}
void modify_student(Student students[], int num_students)
{
char id[MAX_ID_LEN];
printf("请输入要修改的学生的学号:");
scanf("%s", id);
int idx = find_student(students, num_students, id);
if (idx < 0) {
printf("学号 %s 不存在,无法修改记录!\n", id);
return;
}
Student s;
printf("请输入修改后的学生信息(姓名 地址 学号):");
scanf("%s %s %s", s.name, s.addr, s.id);
if (strcmp(s.id, id) != 0 && find_student(students, num_students, s.id) >= 0) {
printf("学号 %s 已存在,无法修改记录!\n", s.id);
return;
}
students[idx] = s;
printf("修改成功!\n");
}
int main()
{
Student students[MAX_STUDENTS];
int num_students = 0;
load_students(students, &num_students);
int choice;
do {
print_header();
int i;
for (i = 0; i < num_students; i++) {
print_student(&students[i]);
}
printf("\n1. 添加学生\n");
printf("2. 删除学生\n");
printf("3. 修改学生\n");
printf("4. 退出程序\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
add_student(students, &num_students);
break;
case 2:
remove_student(students, &num_students);
break;
case 3:
modify_student(students, num_students);
break;
case 4:
break;
default:
printf("无效的选项!\n");
break;
}
} while (choice != 4);
save_students(students, num_students);
return 0;
}
```
这个程序中,我们使用了结构体 `Student` 来存储一个学生的信息,包括姓名、地址和学号。我们定义了一个结构体数组 `students` 来存储所有学生的信息,最多可以存储 `MAX_STUDENTS` 个学生。我们也定义了一些辅助函数来打印表头、打印单个学生的信息、从文件中读取学生信息、将学生信息写入文件、查找学号对应的学生记录等。
在 `main` 函数中,我们先从文件中读取已有的学生信息,然后进入一个循环,每次循环打印所有学生信息,并提示用户进行操作。用户可以选择添加、删除或修改学生信息,或者退出程序。如果用户选择添加学生,则会提示用户输入新的学生信息,并将其添加到 `students` 数组中;如果用户选择删除学生,则会提示用户输入要删除的学生的学号,并将其从 `students` 数组中删除;如果用户选择修改学生,则会提示用户输入要修改的学生的学号以及修改后的学生信息,并将其更新到 `students` 数组中。循环继续,直到用户选择退出程序。
最后,我们将所有的学生信息写入文件中,程序结束。
阅读全文