vs2019中gets_s()语句不执行的原因

有一段时间没写博客啦!今天来分享我的经验,希望对大家的编程之路有用!

今天我在学数据结构栈部分里的栈的应用之括号匹配,不幸的是调bug调很久啦!
在这里插入图片描述

第一部分写的是进制的转换,第二部分是括号匹配。
在进行执行代码的时候,第二部分的gets_s始终不执行,相当于空语句一样,我一开始怀疑我的另一个文件里“栈的应用_后缀表达式”,里的gets_s()的使用,随即我立即注释掉,但还是不起任何作用。我再换一种思路,把本源程序文件里的gets_s()换成scanf语句并执行,结果是可以执行scanf并等待我输入。

接着我又换回原来的gets_s(),还是不行,后面我百度没有发现有此类问题的解答,我觉得台太不科学啊!调试一下是不执行的,直接跳过的。

接着我就把第一部分进制转换 的代码注释掉,果然再执行的时候是等待我输入的,说明gets_s()执行啦!

好啦!感谢你听我说这么多废话,到这里来相信你已经知道问题所在啦!是的

在vs2019里一个源程序文件里若前面有scanf的输入语句时后面的gets_s()是不起任何作用的,本人亲自测试过,

不信你自己试试,其他编译器我就不知道,想知道结果自己试试不就知道啦!哈哈哈

下面附上本人源代码


#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>

typedef int SElemType;
typedef char ElemType;
typedef int Status;

#define OK 1
#define ERROR 0
#define TRUE 1
#define FLASE 0
#define MAXSIZE 30

#define len sizeof(struct Stack)

typedef struct Stack
{
	SElemType* data;
	int top;
}SqStack;

typedef struct Stackfloat
{
	ElemType* data;
	int top;
}SqStackFloat;

void initStack(SqStack*& S);
void initStackfloat(SqStackFloat& S);
//DestroyStack(*S);
//ClearStack(*S);
Status StackEmpty(SqStack* S);
Status StackEmpty(SqStackFloat* S);
Status GetTop(SqStack S, SElemType& e);
Status Push(SqStack* S, SElemType e);
Status Pop(SqStack* S, SElemType* e);
void PrintStack(SqStack* S);
Status StackLength(SqStack* S);
void convert(int number, SqStack* S);
Status match(SqStackFloat* S, char* str);

int main()
{
	SqStack wan;
	SqStackFloat zhipeng;
	SqStack* STheadboss = &wan;
	SElemType x;
	SElemType j;
	ElemType string1[MAXSIZE];
	SElemType exp[MAXSIZE], postexp[MAXSIZE];
	printf("对栈进行初始化:\n");
	initStack(STheadboss);

	Sleep(300);
	if (StackEmpty(STheadboss) == OK)
		printf("栈空\n");
	else
		printf("栈非空\n");

	Sleep(500);
	printf("进栈测试:\n");
	printf("输入要转换的十进制数:");
	//scanf("%d", &x);
	convert(15, STheadboss);
	Sleep(500);
	printf("打印该栈结果如下:");
	PrintStack(STheadboss);
	printf("此时栈长为%d\n", StackLength(STheadboss));
	

	printf("对栈再次进行初始化:\n");
	initStackfloat(zhipeng);
	if (StackEmpty(&zhipeng) == OK)
		printf("栈空\n");
	else
		printf("栈非空\n");
	
	//scanf("%s", string1);//不执行就为空
	gets_s(string1);

	if (match(&zhipeng, string1) == ERROR)
		printf("匹配失败!");

	return 0;
}

void initStack(SqStack*& S)
{
	S->data = (SElemType*)malloc(MAXSIZE);
	S->top = -1;
}
void initStackfloat(SqStackFloat& S)
{
	S.data = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));
	S.top = -1;

}

Status StackEmpty(SqStack* S)
{
	if (S->top == -1)//非指针
		return TRUE;
	else
		return FLASE;
}
Status StackEmpty(SqStackFloat* S)
{
	if (S->top == -1)//非指针
		return TRUE;
	else
		return FLASE;
}

void PrintStack(SqStack* S)
{
	int sum = S->top;
	printf("顺序栈结果为:");
	while (sum != -1)
	{
		printf("%d", S->data[sum--]);
	}
	printf("\n");
}

Status StackLength(SqStack* S)
{
	return S->top + 1;
}


//二进制转换
void convert(int number, SqStack* S)
{
	while (number)
	{
		S->data[++S->top] = number % 2;
		number = number / 2;
	}
	S->data[++S->top] = number;
}

//括号匹配
Status match(SqStackFloat* S, char* str)
{
	int i = 0, flag=0;
	char ch = str[i],e;
	while (ch != '\0')
	{
		switch (ch)
		{
		case '(':
			S->data[++S->top] = ch;
			break;
		case '[':
			S->data[++S->top] = ch;
			break;
		case '{':
			S->data[++S->top] = ch;
			break;
		case ')':
			e=S->data[S->top--] ;
			if (e != '(')
				flag = 1;
			break;
		case ']':
			e = S->data[S->top--];
			if (e != '[')
				flag = 1;
			break;
		case '}':
			e = S->data[S->top--];
			if (e != '{')
				flag = 1;
			break;
		default:
			break;
		}
		if (flag)
			return ERROR;
		i++;
		ch = str[i];
	}
	if (!flag && S->top == -1)
	{
		printf("匹配成功wanzhipeng!\n");
		return OK;
	}
	else
	{
		return FLASE;
	}
}
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页