C语言 为什么这段代码在尝试使用指针读入结构的示例时会引发异常?

js4nwp54  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(86)

我们目前正在学习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的输入,而不是其他的。

avwztpqn

avwztpqn1#

我测试了你的代码,实际上没有得到一个分段错误。但是当代码被编译时,编译器提供了一些线索,并列出了一些警告。

main.c|15|warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[20]’ [-Wformat=]|

这基本上就是说,你正在引用一个“指向指针的指针”,其中输入了一个字符串,在你的测试中,这可能是试图将你的输入存储到内存中一个未定义的区域。
此外,在“scanf”函数中,您不希望包含“\n”(换行符),而只是一个适当的格式引用(例如,“%s”)。
下面是一些重构后的代码。

void readStudent(struct Student* ptr)
{
    printf("Enter name: ");
    scanf("%s", ptr->name);

    printf("Enter id: ");
    scanf("%s", ptr->id);

    printf("Enter GPA: ");
    scanf("%f", &ptr->GPA);             /* Here, the ampersand is proper */
}

此外,为了保持良好的礼仪,由于“main”函数预期返回整数值,因此在完成函数时这样做是一个好主意。

int main()
{
    struct Student* ptr, student1;
    ptr = &student1;
    readStudent(ptr);
    printStudent(ptr);

    return 0;       /* Always a good idea to include when the function is expecting to output an integer value */
}

通过这些重构,下面是程序的测试运行。

craig@Vera:~/C_Programs/Console/StudentInfo/bin/Release$ ./StudentInfo 
Enter name: Craig
Enter id: 10-888-444
Enter GPA: 3.33
Name:Craig
ID:10-888-444
GPA:3.330000

所以,总而言之,要认识到如何在“scanf”调用中引用指针,特别是对于字符数组的字符串。

相关问题