在线提问关于代码问题

#这个代码为什么不能添加信息啊

问题描述:
在文件studd.txt中存放学生信息,学生信息包含学号、姓名和成绩。要求采用菜单形式实现学生记录的创建、添加、查找(按学号进行)、修改(按学号进行)和删除(按学号进行)、显示所有信息等功能。用户可以循环操作直到选择退出为止。
分析:
本题是对文件的综合应用,采用菜单形式可以方便地实现程序模块的设计方法,这样可以使程序显得简洁明了。设计时可以逐个完成各模块功能,并调试好每个模块,然后再整合
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct student
{ char no[10];
char name[20];
int score;
};
char filename[100]="studd.txt"; /*设置文件名*/
FILE *fp;
void create(); /*创建函数声明*/
void append(); /*添加函数声明*/
void search(); /*查找函数声明*/
void del(); /*删除函数声明*/
void modify(); /*修改函数声明*/
void output(); /*显示函数声明*/
int main(void)
{
int num;
while(1)
{
printf(" ***学生成绩系统*** ");
printf(" 1.创建记录 ");
printf(" 2.添加记录 ");
printf(" 3.查找记录 ");
printf(" 4.修改记录 ");
printf(" 5.删除记录 ");
printf(" 6.显示记录 ");
printf(" 0.退出系统 ");
printf(" 选择序号0-6:" );
scanf("%d",&num);
if(num>=0&&num<=6)
{
switch(num)
{ case 1:create();break;
case 2:append();break;
case 3:search();break;
case 4:modify();break;
case 5:del();break;
case 6:output();break;
case 0:exit(1);
}
printf(" 操作完毕,请再次选择! ");
}
else
printf(" 选择错误,请再次选择! ");
}
getch();
return 0;
}
/*创建记录*/
void create()
{
struct student stu;
if((fp=fopen(filename,"w"))==NULL)
{
printf("Cannot Open File! ");
exit(0);
}
fprintf(fp,"%-10s%-20s%-50s ","学号","姓名","成绩");
printf(" 请输入学号、姓名及成绩(以0结束) ");
scanf("%s",stu.no);
while(strcmp(stu.no,"0"))
{
scanf("%s %d",stu.name,&stu.score);
fprintf(fp,"%-10s%-20s%-50d ",stu.no,stu.name,stu.score);
scanf("%s",stu.no);
}
fclose(fp);
}
/*添加记录*/
void append()
{
struct student stu;
if((fp=fopen(filename,"a"))==NULL)
{
printf(" Cannot Open File!");
exit(0);
}
printf(" 请输入要添加的学号、姓名及成绩 ");
scanf("%s%s%d",stu.no,stu.name,&stu.score);
fprintf(fp,"%-10s%-20s%-50d ",stu.no,stu.name,stu.score);
fclose(fp);
}
/*查找记录*/
void search()
{
int k=0;
char nokey[10];
struct student stu;
printf(" 请输入学号:");
scanf("%s",nokey);
if((fp=fopen(filename,"r"))==NULL)
{
printf(" Cannot Open File!");
exit(0);
}
fseek(fp,1L*sizeof(struct student),0);
while(!feof(fp))
{
fscanf(fp,"%s%s%d",stu.no,stu.name,&stu.score);
if(strcmp(nokey,stu.no)==0)
{
printf(" 已查找到,该记录为: ");
printf("%-10s%-20s%-50s","学号","姓名","成绩");
printf("%-10s%-20s%-50d",stu.no,stu.name,stu.score);
k=1;
}
}
if(!k)
printf(" 文件中无此人的记录。");
fclose(fp);
}
/*修改记录*/
void modify()
{
int k=0;
long position;
char nokey[10];
struct student stu;
printf(" 请输入学号:");
scanf("%s",nokey);
if((fp=fopen(filename,"r+"))==NULL)
{
printf(" Cannot Open File!");
exit(0);
}
fseek(fp,1L*sizeof(struct student),0);
while(!feof(fp))
{
fscanf(fp,"%s%s%d",stu.no,stu.name,&stu.score);
if(strcmp(nokey,stu.no)==0)
{ position=ftell(fp);
k=1;
break;
}
}
if(k)
{
printf(" 已查找到,该记录为: ");
printf("%-10s%-20s%-50s","学号","姓名","成绩");
printf("%-10s%-20s%-50d",stu.no,stu.name,stu.score);
printf(" 请输入新的学号、姓名及成绩:");
scanf("%s%s%d",stu.no,stu.name,&stu.score);
fseek(fp,position-1L*sizeof(struct student),SEEK_SET);
fprintf(fp," %-10s%-20s%-50d",stu.no,stu.name,stu.score);
}
else
printf(" 文件中无此人的记录。");
fclose(fp);
}
/*删除记录*/
void del()
{
int m,k=0;
long position;
char nokey[10];
struct student stu;
printf(" 请输入学号:");
scanf("%s",nokey);
if((fp=fopen(filename,"r+"))==NULL)
{
printf(" Cannot Open File!");
exit(0);
}
fseek(fp,1L*sizeof(struct student),0);
while(!feof(fp))
{
fscanf(fp,"%s%s%d",stu.no,stu.name,&stu.score);
if(strcmp(nokey,stu.no)==0)
{ position=ftell(fp);
k=1;
break;
}
}
if(k)
{
printf(" 已查找到,该记录为: ");
printf("%-10s%-20s%-50s","学号","姓名","成绩");
printf("%-10s%-20s%-50d",stu.no,stu.name,stu.score);
printf(" 确实要删除记录,请按1;不删除记录,请按0:");
scanf("%d",&m);
if(m)
{
fseek(fp,position-1L*sizeof(struct student),SEEK_SET);
fprintf(fp,"%-10s%-20s%-50s","","","");
}
}
else
printf(" 文件中无此人的记录。");
fclose(fp);
}
/*显示记录*/
void output()
{
struct student stu;
if((fp=fopen(filename,"r"))==NULL)
{
printf(" Cannot Open File!");
exit(0);
}
printf(" 文件内容为: ");
fseek(fp,1L*sizeof(struct student),0);
while(!feof(fp))
{
fscanf(fp,"%s%s%d ",stu.no,stu.name,&stu.score);
printf("%-10s%-20s%-50d",stu.no,stu.name,stu.score);
}
fclose(fp);
}


根据你提供的代码,我注意到有一个问题可能会导致添加信息失败。在添加记录的函数 append() 中,你使用了 scanf() 函数来读取用户输入的学号、姓名和成绩,但是这些数据之间没有任何分隔符(如空格、逗号等)。因此,当你输入完学号后按下回车键,scanf() 函数会将回车符也作为输入的一部分,导致后面的姓名和成绩无法被正确读取。

为了解决这个问题,你可以在 scanf() 函数中添加分隔符,例如空格或逗号。修改后的 append() 函数如下所示:

void append()
{
    struct student stu;
    if((fp=fopen(filename,"a"))==NULL)
    {
        printf(" Cannot Open File!");
        exit(0);
    }
    printf(" 请输入要添加的学号、姓名及成绩,用空格隔开: ");
    scanf("%s %s %d",stu.no,stu.name,&stu.score);
    fprintf(fp,"%-10s%-20s%-50d ",stu.no,stu.name,stu.score);
    fclose(fp);
}

注意,这里使用了空格作为分隔符,如果你想使用其他字符作为分隔符,可以相应地修改 scanf() 函数的格式字符串。

另外,为了方便调试,你可以在程序中添加一些调试输出语句,例如打印出用户输入的数据,或者打印出文件读写的状态等。这样可以帮助你更快地发现问题所在。

上面代码没什么问题,能添加信息。
下面是修改过输出格式添加了换行符的代码,供参考:

//问题描述:
//在文件studd.txt中存放学生信息,学生信息包含学号、姓名和成绩。要求采用菜单形式实现学生记录的
// 创建、添加、查找(按学号进行)、修改(按学号进行)和删除(按学号进行)、显示所有信息等功能。
// 用户可以循环操作直到选择退出为止。
//分析:
//本题是对文件的综合应用,采用菜单形式可以方便地实现程序模块的设计方法,这样可以使程序显得简洁明了。
//设计时可以逐个完成各模块功能,并调试好每个模块,然后再整合

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct student
{
    char no[12];
    char name[20];
    int  score;
};
char filename[100] = "studd.txt"; //设置文件名
FILE* fp;
void create(); //创建函数声明
void append(); //添加函数声明
void search(); //查找函数声明
void del(); //删除函数声明
void modify(); //修改函数声明
void output(); //显示函数声明

int main(void)
{
    int num;
    while (1)
    {
        printf(" ***学生成绩系统*** ");
        printf(" 1.创建记录 ");
        printf(" 2.添加记录 ");
        printf(" 3.查找记录 ");
        printf(" 4.修改记录 ");
        printf(" 5.删除记录 ");
        printf(" 6.显示记录 ");
        printf(" 0.退出系统 ");
        printf(" 选择序号0-6:");
        scanf("%d", &num);
        if (num >= 0 && num <= 6)
        {
            switch (num)
            {
            case 1:create(); break;
            case 2:append(); break;
            case 3:search(); break;
            case 4:modify(); break;
            case 5:del(); break;
            case 6:output(); break;
            case 0:exit(1);
            }
            printf(" 操作完毕,请再次选择!\n");
        }
        else
            printf(" 选择错误,请再次选择!\n");
    }
    getch();
    return 0;
}
//创建记录
void create()
{
    struct student stu;
    if ((fp = fopen(filename, "w")) == NULL)
    {
        printf("Cannot Open File! ");
        exit(0);
    }
    fprintf(fp, "%-10s%-20s%-50s ", "学号", "姓名", "成绩");
    printf(" 请输入学号、姓名及成绩(以0结束) ");
    scanf("%s", stu.no);
    while (strcmp(stu.no, "0"))
    {
        scanf("%s %d", stu.name, &stu.score);
        fprintf(fp, "%-10s%-20s%-50d ", stu.no, stu.name, stu.score);
        scanf("%s", stu.no);
    }
    fclose(fp);
}
//添加记录
void append()
{
    struct student stu;
    if ((fp = fopen(filename, "a")) == NULL)
    {
        printf(" Cannot Open File!");
        exit(0);
    }
    printf(" 请输入要添加的学号、姓名及成绩 ");
    scanf("%s%s%d", stu.no, stu.name, &stu.score);
    fprintf(fp, "%-10s%-20s%-50d ", stu.no, stu.name, stu.score);
    fclose(fp);
}
//查找记录
void search()
{
    int k = 0;
    char nokey[10];
    struct student stu;
    printf(" 请输入学号:");
    scanf("%s", nokey);
    if ((fp = fopen(filename, "r")) == NULL)
    {
        printf(" Cannot Open File!\n");
        exit(0);
    }
    fseek(fp, 1L * sizeof(struct student), 0);
    while (!feof(fp))
    {
        fscanf(fp, "%s%s%d", stu.no, stu.name, &stu.score);
        if (strcmp(nokey, stu.no) == 0)
        {
            printf(" 已查找到,该记录为: ");
            printf("%-10s%-20s%-50s", "学号", "姓名", "成绩");
            printf("%-10s%-20s%-50d\n", stu.no, stu.name, stu.score);
            k = 1;
        }
    }
    if (!k)
        printf(" 文件中无此人的记录。\n");
    fclose(fp);
}
//修改记录
void modify()
{
    int k = 0;
    long position;
    char nokey[10];
    struct student stu;
    printf(" 请输入学号:");
    scanf("%s", nokey);
    if ((fp = fopen(filename, "r+")) == NULL)
    {
        printf(" Cannot Open File!\n");
        exit(0);
    }
    fseek(fp, 1L * sizeof(struct student), 0);
    while (!feof(fp))
    {
        fscanf(fp, "%s%s%d", stu.no, stu.name, &stu.score);
        if (strcmp(nokey, stu.no) == 0)
        {
            position = ftell(fp);
            k = 1;
            break;
        }
    }
    if (k)
    {
        printf(" 已查找到,该记录为: ");
        printf("%-10s%-20s%-50s", "学号", "姓名", "成绩");
        printf("%-10s%-20s%-50d\n", stu.no, stu.name, stu.score);
        printf(" 请输入新的学号、姓名及成绩:");
        scanf("%s%s%d", stu.no, stu.name, &stu.score);
        fseek(fp, position - 1L * sizeof(struct student), SEEK_SET);
        fprintf(fp, " %-10s%-20s%-50d", stu.no, stu.name, stu.score);
    }
    else
        printf(" 文件中无此人的记录。\n");
    fclose(fp);
}
//删除记录
void del()
{
    int m, k = 0;
    long position;
    char nokey[10];
    struct student stu;
    printf(" 请输入学号:");
    scanf("%s", nokey);
    if ((fp = fopen(filename, "r+")) == NULL)
    {
        printf(" Cannot Open File!\n");
        exit(0);
    }
    fseek(fp, 1L * sizeof(struct student), 0);
    while (!feof(fp))
    {
        fscanf(fp, "%s%s%d", stu.no, stu.name, &stu.score);
        if (strcmp(nokey, stu.no) == 0)
        {
            position = ftell(fp);
            k = 1;
            break;
        }
    }
    if (k)
    {
        printf(" 已查找到,该记录为: \n");
        printf("%-10s%-20s%-50s\n", "学号", "姓名", "成绩");
        printf("%-10s%-20s%-50d\n", stu.no, stu.name, stu.score);
        printf(" 确实要删除记录,请按1;不删除记录,请按0:");
        scanf("%d", &m);
        if (m)
        {
            fseek(fp, position - 1L * sizeof(struct student), SEEK_SET);
            fprintf(fp, "%-10s%-20s%-50s", "", "", "");
        }
    }
    else
        printf(" 文件中无此人的记录。\n");
    fclose(fp);
}
//显示记录
void output()
{
    struct student stu;
    if ((fp = fopen(filename, "r")) == NULL)
    {
        printf(" Cannot Open File!");
        exit(0);
    }
    printf(" 文件内容为: \n");
    fseek(fp, 1L * sizeof(struct student), 0);
    while (!feof(fp))
    {
        fscanf(fp, "%s%s%d ", stu.no, stu.name, &stu.score);
        printf("%-10s%-20s%-50d\n", stu.no, stu.name, stu.score);
    }
    fclose(fp);
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7524146
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:单链表逆置代码解析
  • 除此之外, 这篇博客: 约瑟夫问题中的 代码实现 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    // An highlighted block
    #include<stdio.h>
    #include<stdlib.h>
    typedef struct Node {
    	int num;
    	struct Node *next;
    	struct Node *ahead;
    }Node;
    Node *Create(int N);
    Node *Search(Node *head,int P);
    Node *Release(Node *head,int M);
    int main()
    {
    	int M, P, N;
    	scanf("%d%d%d", &N,&M,&P);//p起始点m释放点
    	Node *head = Create(N);
    	head = Search(head, P);
    	while (head->next != head)
    	{
    		head = Release(head, M);
    	}
    	printf("%d",head->num);
    	return 0;
    }
    Node *Create(int N)
    {
    	int n=1;
    	Node* node = (Node*)malloc(sizeof(Node));//new Node;
    	node->num = n;
    	Node * head = node;
    	Node* tail = head;
    	while (n++ < 
    	N)
    	{
    		node = (Node*)malloc(sizeof(Node));
    		node->num = n;
    		tail->next = node;
    		node->ahead = tail;
    		tail = tail->next;
    	}
    	tail->next = head;
    	head->ahead = tail;
    	return head;
    }
    Node *Search(Node* head, int P)
    {
    	while (head->num != P)
    	{
    		head = head->next;
    	}
    	return head;
    }
    Node *Release(Node* head, int M)
    {
    	int count = 1;
    	Node* temp = head;
    	while (count < M)
    	{
    		temp = temp->next;
    		count++;
    	}
    	temp->ahead->next = temp->next;
    	temp->next->ahead = temp->ahead;
    	printf("%d", temp->num);
    	head = temp->next;
    	delete temp;
    	return head;
    }
    
  • 您还可以看一下 杜成浩老师的汇编语言程序设计课程中的 代码段和数据段小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    问题是在计算两个数字的和时,遇到了参数类型不匹配的错误。根据给出的代码,问题出在尝试将一个整数和一个字符串相加。

    为了解决这个问题,我们需要确保两个数字的类型是一致的。下面是解决方案代码:

    def sum_numbers(num1, num2):
        if type(num1) != int or type(num2) != int:
            raise TypeError("参数类型不匹配,请确保传入的参数是整数类型。")
    
        return num1 + num2
    
    result = sum_numbers(5, 10)
    print(result)
    

    在这个解决方案中,我们首先在函数内部添加了一个判断条件来检查传入的参数类型。如果类型不是整数(int),将抛出一个自定义的错误类型(TypeError)。这样可以确保传入的参数是整数类型。

    然后,我们将两个整数相加并返回结果。

    最后,我们调用sum_numbers函数并打印结果。

    这样,我们就能够在保证传入参数类型正确的前提下,成功计算两个数字的和。如果参数类型不匹配,将抛出一个错误提示用户传入正确的参数。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^