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;
	}
}
修改以下代码,并解释改正的原因:#define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6031) #include <stdio.h> #include <stdlib.h> #include <mysql.h> #include <string.h> #define N 3 MYSQL* conn; MYSQL m; void initialize() { // 初始化链接 conn = mysql_init(NULL); mysql_options(&m, MYSQL_SET_CHARSET_NAME, "gbk"); // 连接数据库 if (!mysql_real_connect(conn, "localhost", "b", "12345", "tang", 0, NULL, 0)) { printf("连接数据库失败: %s\n", mysql_error(conn)); exit(1); } else printf("数据库连接成功!\n"); } //录入学生信息 void Insert(MYSQL* mysql) { int i = 0; char* str1 = "insert into student(id,name,chengji) values("; char sql_insert[200]; for (i = 1; i <= N; i++) { char id[12], name[9]; char chengji=0; printf("请输入学生学号:"); gets_s(id, 12); printf("请输入学生姓名:"); gets_s(name, 9); printf("请输入学生成绩:"); gets_s(chengji, 9); int n = getchar(); sprintf(sql_insert," %s'%s', %5s", str1, id, name, chengji); mysql_query(mysql, sql_insert); printf("录入信息成功!\n"); } return; } // 显示学生信息 void Display(MYSQL* mysql) { char* str = "select from student"; MYSQL_RES* res; //一个结果集结构体 MYSQL_ROW row = NULL; //char**二维数组,存放一条条记录(一条记录代表一个学生的信息) char id[12], name[9]; char chengji; //向HySQL发送SQL语句 mysql_query(mysql, str); //获取结果集 res = mysql_store_result(mysql); //打印 printf("id\t name\t chengji\t"); while (row = mysql_fetch_row(res)) { for (int i = 0; i < mysql_num_fields(res); i++) { switch (i) { case 0: { strcpy(id, row[i]); break; } case 1: { strcpy(name, row[i]); break; } case 2: { strcpy(chengji, row[i]); break; } break; } } } printf("10s\t, %11s\t,%4s\n", id, name,chengji); nysql_free_result(res); } void finalize(){ // 关闭连接 mysql_close(conn); printf("已关闭数据库"); } int main() { initialize(); insert(); finalize(); return 0; }
05-29
下面是修改后的代码,同时也会解释改正的原因: ```c #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6031) #include <stdio.h> #include <stdlib.h> #include <mysql.h> #include <string.h> #define N 3 MYSQL* conn; MYSQL m; void initialize() { // 初始化链接 conn = mysql_init(NULL); mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk"); // 连接数据库 if (!mysql_real_connect(conn, "localhost", "b", "12345", "tang", 0, NULL, 0)) { printf("连接数据库失败: %s\n", mysql_error(conn)); exit(1); } else printf("数据库连接成功!\n"); } //录入学生信息 void Insert(MYSQL* mysql) { int i = 0; char* str1 = "insert into student(id,name,chengji) values("; char sql_insert[200]; for (i = 1; i <= N; i++) { char id[12], name[9]; char chengji[9]; printf("请输入学生学号:"); fgets(id, 12, stdin); printf("请输入学生姓名:"); fgets(name, 9, stdin); printf("请输入学生成绩:"); fgets(chengji, 9, stdin); int n = getchar(); sprintf(sql_insert, " %s'%s', '%s', '%s')", str1, id, name, chengji); mysql_query(mysql, sql_insert); printf("录入信息成功!\n"); } return; } // 显示学生信息 void Display(MYSQL* mysql) { char* str = "select * from student"; MYSQL_RES* res; //一个结果集结构体 MYSQL_ROW row = NULL; //char**二维数组,存放一条条记录(一条记录代表一个学生的信息) char id[12], name[9]; char chengji[9]; //向MySQL发送SQL语句 mysql_query(mysql, str); //获取结果集 res = mysql_store_result(mysql); //打印 printf("id\t name\t chengji\t\n"); while (row = mysql_fetch_row(res)) { for (int i = 0; i < mysql_num_fields(res); i++) { switch (i) { case 0: { strcpy(id, row[i]); break; } case 1: { strcpy(name, row[i]); break; } case 2: { strcpy(chengji, row[i]); break; } } } printf("%s\t %s\t %s\t\n", id, name, chengji); } mysql_free_result(res); } void finalize() { // 关闭连接 mysql_close(conn); printf("已关闭数据库"); } int main() { initialize(); Insert(conn); Display(conn); finalize(); return 0; } ``` 改正的原因如下: 1. `MYSQL* conn; MYSQL m;` 这一行代码,`MYSQL m;`是不需要的,因为我们只需要一个`MYSQL*`类型的指针即可。 2. `mysql_options(&m, MYSQL_SET_CHARSET_NAME, "gbk");` 的`&m`应该改为`conn`,因为我们要设置的是`conn`这个MySQL连接的属性,而不是`m`这个无用的变量。 3. `gets_s`函数不是标准C函数,且存在安全问题,所以应该使用更安全的`fgets`函数。同时,`chengji`应该是一个字符串类型,而不是字符类型。 4. `mysql_query`函数执行的SQL语句,缺少了一个右括号`)`,导致语法错误。 5. `Display`函数的SQL语句缺少了`*`,导致无法获取到所有的学生信息。 6. `Display`函数打印学生信息的语句格式不正确,应该为`"%s\t %s\t %s\t\n"`。 7. `mysql_free_result`函数的名称拼写错误,应该为`mysql_free_result`。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值