scanf_s("%c %c", &c, &a);为什么报空指针错误
时间: 2023-11-27 20:43:00 浏览: 77
在使用`scanf_s`函数时,它的格式字符串中的空格会被解释成输入数据的分隔符。而在你提供的代码中,格式字符串为"%c %c",即要求输入两个字符,并用空格分隔。但是你在调用`scanf_s`函数时,并没有为两个字符变量`c`和`a`分配内存空间,导致空指针错误的发生。
为了解决这个问题,你需要为`c`和`a`分配内存空间,可以使用字符数组或者指针来实现。具体的做法如下:
```c
#include <stdio.h>
int main() {
char c, a;
scanf_s(" %c %c", &c, sizeof(c), &a, sizeof(a)); // 在%c前加一个空格,表示忽略输入中的空白字符
printf("%c %c", c, a);
return 0;
}
```
这样,在调用`scanf_s`函数时,你为`c`和`a`分配了足够的内存空间,就可以正确读取输入的字符了。
相关问题
#include<stdio.h> #include<stdlib.h> #include<string.h> #define LEN sizeof(struct staff) struct staff { int num; char name[20]; char station[10]; int score; struct staff *next; }; int main() { struct staff *h,*p,*q; int num; char s[10]; h=(struct staff*)malloc(LEN); h->next=NULL;//建立带头结点的空链表 scanf("%d",&num); q=h; while(num!=0) { p=(struct stu*)malloc(LEN); p->num=num; scanf("%s %s %d",p->name,p->station,&p->score); p->next=NULL; q->next=p; q=p; scanf("%d",&num); }//输入数据到0截止 scanf("%s",s); p=h->next; while(p!=NULL) { if(strcmp(p->station,s)!=0) { printf("%d %s %s %d\n",p->num,p->name,p->station,p->score); p=p->next;} } } 修改程序
这段代码存在一些问题,包括变量类型不匹配、指针类型错误、结构体成员变量的访问方式错误等,请参考下面的修改建议:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct staff {
int num;
char name[20];
char station[10];
int score;
struct staff* next;
};
int main() {
struct staff* head, * p, * q;
int num, score;
char name[20], station[10], s[10];
head = (struct staff*)malloc(sizeof(struct staff)); // 建立带头结点的空链表
head->next = NULL;
scanf("%d", &num);
q = head;
while (num != 0) {
p = (struct staff*)malloc(sizeof(struct staff));
p->num = num;
scanf("%s %s %d", p->name, p->station, &score);
p->score = score;
p->next = NULL;
q->next = p;
q = p;
scanf("%d", &num);
} // 输入数据到0截止
scanf("%s", s);
p = head->next;
while (p != NULL) {
if (strcmp(p->station, s) != 0) {
printf("%d %s %s %d\n", p->num, p->name, p->station, p->score);
}
p = p->next;
}
// 释放内存
p = head;
while (p != NULL) {
q = p->next;
free(p);
p = q;
}
return 0;
}
```
主要的修改包括:
1. 在输入员工信息时,将 `p->score` 的地址传入 `scanf` 函数,以便正确读取员工分数。
2. 在输入员工信息时,将 `name` 和 `station` 数组作为参数传入 `scanf` 函数,以便正确读取员工姓名和职位。
3. 在 `main` 函数中添加释放内存的代码,以防止内存泄漏。
#include <stdio.h> #include <string.h> #define n 20 void zhuce(); void denglu(); char yhm[n],mm[n]; struct imz { char yhm[n]; char mm[n]; }; int main() { int i; printf("-----------\n1.注册\n2.登陆\n0.退出\n"); scanf("%d",&i); switch(i) { case 0: break; case 1: zhuce(); break; case 2: denglu(); break; } return 0; } void zhuce( ) { struct imz z; char temp1[n],temp2[n],yhmtmp[n]; FILE *fp; fp=fopen("zhanghao","ab"); printf("输入用户名\n"); scanf("%s",yhmtmp); printf("输入密码\n"); scanf("%s",temp1); printf("输入密码确认\n"); scanf("%s",temp2);; if(!strcmp(temp1,temp2)) { strcpy(z.yhm,yhmtmp); strcpy(z.mm,temp1); fwrite(&z,sizeof(struct imz),1,fp); printf("注册成功\n"); } else { printf("注册失败\n"); zhuce(); } fclose(fp); } void denglu( ) { FILE *fp; struct imz h; char s1[n],s2[n]; fp=fopen("zhanghao","r"); printf("输入用户名\n"); scanf("%s",s1); printf("输入密码\n"); scanf("%s",s2); fread(&h,sizeof(struct imz),1,fp); if(s1==h.yhm) { if(s2==h.mm) { printf("登陆成功\n"); } } else { printf("用户名或密码错误\n"); } fclose(fp); }
这段代码是一个简单的用户注册和登录系统,使用 C 语言编写。
具体分析如下:
1. `#include<stdio.h>` 和 `#include<string.h>` 是用来引入标准输入输出库和字符串处理库的头文件。
2. `#define n 20` 定义了一个宏,表示用户名和密码的最大长度为 20 个字符。
3. `void zhuce();` 和 `void denglu();` 是两个函数的声明,分别用来处理用户注册和登录。
4. `char yhm[n],mm[n];` 定义了两个字符数组,用来存储用户输入的用户名和密码。
5. `struct imz { char yhm[n]; char mm[n]; };` 定义了一个结构体 `imz`,其中包含了两个成员变量 `yhm` 和 `mm`,分别用来存储用户名和密码。
6. `int main()` 是程序的入口函数,其中 `int` 表示函数返回值类型为整型,`main` 是函数名,空括号表示该函数没有参数。
7. `printf("-----------\n1.注册\n2.登陆\n0.退出\n");` 输出菜单,提供用户三个选项:注册、登录和退出。
8. `scanf("%d",&i);` 用户输入选项,并将其存储在变量 `i` 中。
9. `switch(i)` 根据用户输入的选项进行分支处理。
10. `case 0: break;` 如果用户选择退出,则直接退出程序。
11. `case 1: zhuce(); break;` 如果用户选择注册,则调用函数 `zhuce()` 进行注册处理。
12. `case 2: denglu(); break;` 如果用户选择登录,则调用函数 `denglu()` 进行登录处理。
13. `void zhuce( ) { ... }` 函数定义,用来处理用户注册。
14. `struct imz z;` 定义了一个结构体变量 `z`,用来存储用户注册信息。
15. `char temp1[n],temp2[n],yhmtmp[n];` 定义了三个字符数组,分别用来存储用户输入的密码和用户名。
16. `FILE *fp; fp=fopen("zhanghao","ab");` 定义了一个文件指针 `fp`,并打开了一个名为 `zhanghao` 的文件,以追加写入的方式打开。
17. `scanf("%s",yhmtmp); scanf("%s",temp1); scanf("%s",temp2);` 分别获取用户输入的用户名、密码和确认密码。
18. `if(!strcmp(temp1,temp2)) { ... } else { ... }` 如果两次输入的密码相同,则将用户名和密码存储到结构体变量 `z` 中,并将其写入文件中。否则,提示用户注册失败,并重新调用 `zhuce()` 函数。
19. `fclose(fp);` 关闭文件。
20. `void denglu( ) { ... }` 函数定义,用来处理用户登录。
21. `FILE *fp; struct imz h; char s1[n],s2[n];` 定义了一个文件指针 `fp`,一个结构体变量 `h`,以及两个字符数组 `s1` 和 `s2`,分别用来存储从文件中读取的用户名和密码,以及用户输入的用户名和密码。
22. `fopen("zhanghao","r");` 打开文件 `zhanghao`,以只读方式打开。
23. `scanf("%s",s1); scanf("%s",s2);` 获取用户输入的用户名和密码。
24. `fread(&h,sizeof(struct imz),1,fp);` 从文件中读取一个结构体大小的数据,并将其存储到变量 `h` 中。
25. `if(s1==h.yhm) { ... } else { ... }` 如果用户输入的用户名和从文件中读取的用户名相同,则比较用户输入的密码和从文件中读取的密码是否相同。如果相同,则提示用户登录成功;否则,提示用户名或密码错误。
26. `fclose(fp);` 关闭文件。
注意:该程序存在一些问题,例如在比较字符串时应该使用 `strcmp()` 函数而不是 `==` 运算符,还有一些其他的细节问题,需要进一步完善。
阅读全文