我们目前正在学习C语言中的地址和指针逻辑,这在前面的课堂作业中已经给出了。每次我运行这段代码时,我都会在第一行scanf_s之后抛出一个异常。
任何帮助将不胜感激!
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
struct Student
{
char name[20];
char id[10];
float GPA;
};
void readStudent(struct Student* ptr)
{
printf("Enter name: ");
scanf("%s\n", &ptr->name);
printf("Enter id: ");
scanf("%s\n", &ptr->id);
printf("Enter GPA: ");
scanf("%f\n", &ptr->GPA);
}
void printStudent(struct Student* ptr)
{
printf("Name:%s\n", ptr->name);
printf("ID:%s\n", ptr->id);
printf("GPA:%f\n", ptr->GPA);
}
int main()
{
struct Student* ptr, student1;
ptr = &student1;
readStudent(ptr);
printStudent(ptr);
}
更新:我将其更改为scan_f而不是scanf_s,但现在它只接受第一个scan_f的输入,而不是其他的。
1条答案
按热度按时间avwztpqn1#
我测试了你的代码,实际上没有得到一个分段错误。但是当代码被编译时,编译器提供了一些线索,并列出了一些警告。
这基本上就是说,你正在引用一个“指向指针的指针”,其中输入了一个字符串,在你的测试中,这可能是试图将你的输入存储到内存中一个未定义的区域。
此外,在“scanf”函数中,您不希望包含“\n”(换行符),而只是一个适当的格式引用(例如,“%s”)。
下面是一些重构后的代码。
此外,为了保持良好的礼仪,由于“main”函数预期返回整数值,因此在完成函数时这样做是一个好主意。
通过这些重构,下面是程序的测试运行。
所以,总而言之,要认识到如何在“scanf”调用中引用指针,特别是对于字符数组的字符串。