scanf_s("%c %c", &c, &a);为什么报空指针错误
时间: 2023-11-27 19:43:00 浏览: 42
在使用`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` 函数中添加释放内存的代码,以防止内存泄漏。
int Matching( void ) {Stack S; InitStack( S ); int flag = 1; char ch; scanf(“%c”, &ch ); while( ch!=‘#’ && flag ){ switch( ch){ case ‘[‘: case ‘(‘: push( S, ch ); break; case ‘)’: if( !StackEmpty(S)&&GetTop(S)==‘(‘ ) pop(S,x); else flag = 0; break; case ‘]’: if( !StackEmpty(S)&&GetTop(S)==‘[‘ ) pop(S,x); else flag = 0; break; } scanf(“%c”, &ch ); } if (StackEmpty( S ) && flag) return 1; else return 0; } void main( ) { int i; i = Matching( ); if( i==1 ) printf(“匹配!”); else printf(“不匹配!”); } (1)添加栈操作函数,使上面的程序能够运行。 (2)改进匹配函数(函数另外命名),使之能通过返回值进行更细致的区分:1表示正确、0表示交叉错误、-1表示右边多、-2表示左边多。 (3)改进匹配函数(函数另外命名),使之能实现左右花括号{}、 左右双引号、左右单引号、左右尖括号< >,以及注释/* */是否匹配的判断。 (4)改进匹配函数(函数另外命名),使之能从
(1) 以下是添加栈操作函数的代码:
typedef struct {
char* base; // 栈底指针
char* top; // 栈顶指针
int size; // 栈的大小
} Stack;
// 初始化栈
void InitStack(Stack &S, int size = 100) {
S.base = new char[size];
S.top = S.base;
S.size = size;
}
// 判断栈是否为空
bool StackEmpty(Stack S) {
return S.top == S.base;
}
// 获取栈顶元素
char GetTop(Stack S) {
if (!StackEmpty(S)) {
return *(S.top - 1);
}
return '\0';
}
// 元素入栈
void Push(Stack &S, char x) {
if (S.top - S.base == S.size) {
printf("Stack Overflow!");
exit(0);
}
*(S.top++) = x;
}
// 元素出栈
void Pop(Stack &S, char &x) {
if (StackEmpty(S)) {
printf("Stack Underflow!");
exit(0);
}
x = *(--S.top);
}
(2) 以下是改进匹配函数的代码,能够通过返回值进行更细致的区分:
int Matching() {
Stack S;
InitStack(S);
int flag = 1;
char ch, x;
scanf("%c", &ch);
while (ch != '#' && flag) {
switch (ch) {
case '[':
case '(':
Push(S, ch);
break;
case ')':
if (!StackEmpty(S) && GetTop(S) == '(') {
Pop(S, x);
} else {
flag = 0;
}
break;
case ']':
if (!StackEmpty(S) && GetTop(S) == '[') {
Pop(S, x);
} else {
flag = 0;
}
break;
}
scanf("%c", &ch);
}
if (StackEmpty(S) && flag) {
return 1; // 匹配
} else if (GetTop(S) == '(') {
return -2; // 左边多
} else if (flag == 0 && ch == '#') {
return -1; // 右边多
} else {
return 0; // 交叉错误
}
}
(3) 以下是改进匹配函数的代码,能够实现更多类型的括号匹配:
int Matching() {
Stack S;
InitStack(S);
int flag = 1;
char ch, x;
scanf("%c", &ch);
while (ch != '#' && flag) {
switch (ch) {
case '[':
case '(':
case '{':
case '<':
Push(S, ch);
break;
case ')':
if (!StackEmpty(S) && GetTop(S) == '(') {
Pop(S, x);
} else {
flag = 0;
}
break;
case ']':
if (!StackEmpty(S) && GetTop(S) == '[') {
Pop(S, x);
} else {
flag = 0;
}
break;
case '}':
if (!StackEmpty(S) && GetTop(S) == '{') {
Pop(S, x);
} else {
flag = 0;
}
break;
case '>':
if (!StackEmpty(S) && GetTop(S) == '<') {
Pop(S, x);
} else {
flag = 0;
}
break;
case '\'':
if (!StackEmpty(S) && GetTop(S) == '\'') {
Pop(S, x);
} else {
Push(S, ch);
}
break;
case '\"':
if (!StackEmpty(S) && GetTop(S) == '\"') {
Pop(S, x);
} else {
Push(S, ch);
}
break;
case '/':
scanf("%c", &ch);
if (ch == '*') {
Push(S, ch);
}
break;
case '*':
scanf("%c", &ch);
if (ch == '/') {
if (!StackEmpty(S) && GetTop(S) == '/') {
Pop(S, x);
}
}
break;
}
scanf("%c", &ch);
}
if (StackEmpty(S) && flag) {
return 1; // 匹配
} else if (GetTop(S) == '(' || GetTop(S) == '{' || GetTop(S) == '[' || GetTop(S) == '<') {
return -2; // 左边多
} else if (flag == 0 && ch == '#') {
return -1; // 右边多
} else {
return 0; // 交叉错误
}
}
(4) 由于没有具体要求,这里只是给出一种改进匹配函数的思路,能够从文件中读取括号匹配的文本并进行匹配,具体实现方式可以根据需求进行修改:
int MatchingFromFile() {
Stack S;
InitStack(S);
int flag = 1;
char ch, x;
FILE *fp;
fp = fopen("brackets.txt", "r");
if (fp == NULL) {
printf("Failed to open file!");
exit(0);
}
ch = fgetc(fp);
while (ch != EOF && flag) {
switch (ch) {
case '[':
case '(':
case '{':
case '<':
Push(S, ch);
break;
case ')':
if (!StackEmpty(S) && GetTop(S) == '(') {
Pop(S, x);
} else {
flag = 0;
}
break;
case ']':
if (!StackEmpty(S) && GetTop(S) == '[') {
Pop(S, x);
} else {
flag = 0;
}
break;
case '}':
if (!StackEmpty(S) && GetTop(S) == '{') {
Pop(S, x);
} else {
flag = 0;
}
break;
case '>':
if (!StackEmpty(S) && GetTop(S) == '<') {
Pop(S, x);
} else {
flag = 0;
}
break;
case '\'':
if (!StackEmpty(S) && GetTop(S) == '\'') {
Pop(S, x);
} else {
Push(S, ch);
}
break;
case '\"':
if (!StackEmpty(S) && GetTop(S) == '\"') {
Pop(S, x);
} else {
Push(S, ch);
}
break;
case '/':
ch = fgetc(fp);
if (ch == '*') {
Push(S, ch);
}
break;
case '*':
ch = fgetc(fp);
if (ch == '/') {
if (!StackEmpty(S) && GetTop(S) == '/') {
Pop(S, x);
}
}
break;
}
ch = fgetc(fp);
}
if (StackEmpty(S) && flag) {
return 1; // 匹配
} else if (GetTop(S) == '(' || GetTop(S) == '{' || GetTop(S) == '[' || GetTop(S) == '<') {
return -2; // 左边多
} else {
return 0; // 交叉错误或右边多
}
}
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)