main函数里scanf_s("%c",&t)字符没办f法输入,断点调试时&t显示“烫”,求看看问题在哪?
#include
#include
#include
#include
#include"SqList.h"
#define TRUE 1
#define FALSE 0
#define MaxSize 10 //线性表存储空间大小
typedef char ElemType;
typedef struct {
ElemType data[MaxSize]; //存放线性表中元素
int length; //存放线性表长度
}SqList; //静态顺序表的结构体类型
//初始化
void InitList_Sq(SqList*& L)
{
L = (SqList*)malloc(sizeof(SqList));
L->length = 0;
}
//输出顺序表
void ListTraverse_Sq(SqList* L)
{
int i;
for (i = 0; i < L->length; i++)
{
printf("输出顺序表:%d ", L->data[i]);
}
printf("\n");
}
//输出顺序表的长度
int ListLength_Sq(SqList* L)
{
return (L->length);
}
//判断顺序表是否为空
bool ListEmpty_Sq(SqList* L)
{
printf("将判断顺序表是否为空:(TRUE or FALSE)");
if (L->length == 0)
return TRUE;
else
return FALSE;
}
//按位序查找元素
char GetList_Sq(SqList* L,int i)
{
scanf_s("%d", &i);
return (L->data[i]);
}
//输出元素的逻辑位置
int LocateElem_Sq(SqList* L, ElemType e)
{
int i=0;
while (i < L->length && L->data[i] != e)
i++;
if (i < L->length)
return i + 1;
else
return 0;
}
//插入元素
bool ListInsert_Sq(SqList* L, int i, ElemType e)
{
int j;
if (i<1 || i>L->length + 1 || L->length >= MaxSize)
return FALSE;
i--;
for (j = L->length; j > i; j--)
{
L->data[j] = L->data[j - 1];
}
L->data[i - 1] = e;
L->length++;
return TRUE;
}
//删除元素
bool ListDelete_Sq(SqList*& L, int i, ElemType& e)
{
int j;
if ((i < 1) || (i > L->length))
return FALSE;
i--;
e = L->data[i];
for (j = i; j < L->length - 1; j++)
{
L->data[j] = L->data[j + 1];
}
L->length--;
return TRUE;
}
//释放顺序表
void DestroyList_Sq(SqList*& L)
{
free(L);
}
int main()
{
SqList*L;
int i=0,j=0,k=0;
ElemType e;
char t,e1, e2;
InitList_Sq(L);
printf("请输入顺序表的大小:");
scanf_s("%d", &L->length);
for (j = 0; j < L->length; ++j)
{
printf("请输入你想要插入的新的元素:");
scanf_s("%c", &t);
ListInsert_Sq(L, j, t);
}
ListTraverse_Sq(L);
ListLength_Sq(L);
ListEmpty_Sq(L);
printf("输入你想要查找的元素的位序:");
scanf_s("%d",&i);
GetList_Sq(L,i);
printf("请输入你要查找位置的元素值:");
scanf_s("%c", &e1);
LocateElem_Sq(L, e1);
printf("请输入你想要在哪一个位置之前插入新的元素:");
scanf_s("%d", &i);
printf("请输入你想要插入的新的元素:");
scanf_s("%c", &e2);
ListInsert_Sq(L, i, e2);
ListTraverse_Sq(L);
printf("请输入你要删除的元素的逻辑位序:");
scanf_s("%d", &k);
ListDelete_Sq(L, k,e);
ListTraverse_Sq(L);
DestroyList_Sq(L);
system("pause");
return 0;
}
参考GPT:这个问题可能是由于输入缓冲区中还有一个换行符的原因。可以在 scanf_s("%d", &L->length); 前加上一句 getchar();,将输入缓冲区中的换行符读取掉,然后再输入字符即可。修改后的代码如下:
...
printf("请输入顺序表的大小:");
scanf_s("%d", &L->length);
getchar(); // 读取输入缓冲区中的换行符
for (j = 0; j < L->length; ++j)
{
printf("请输入你想要插入的新的元素:");
scanf_s("%c", &t);
ListInsert_Sq(L, j, t);
}
...
这样修改后,就可以正确输入字符了。
scanf_s("%c",&t,1)
scanf_s("%c", &e1,1);
scanf_s("%c", &e2,1);
ListInsert_Sq(L, j, t);
这里下断点调试下
你上来就i--了,如果顺序表里面为空,显然i=-1,下面肯定不对
参考GPT和自己的思路:这种情况通常是因为在调用其他函数前,已经有字符输入到输入缓冲区中了(例如输入顺序表大小时按下了回车键),导致下一个scanf_s函数读取到的是回车键。解决办法是在scanf_s前加入一条getchar语句,将输入缓冲区中的回车键读取掉。例如在插入元素的地方加入以下代码:
printf("请输入你想要插入的新的元素:");
getchar(); //读取掉输入缓冲区中的回车键
scanf_s("%c", &t);
ListInsert_Sq(L, j, t);
该回答引用于gpt与OKX安生共同编写:
问题出在输入字符时,scanf_s("%c",&t)会读取回车符,因此需要在前面加上一个getchar()来清空缓存区。修改代码如下:
//输入元素
bool ListInsert_Sq(SqList* L, int i, ElemType e)
{
int j;
if (i<1 || i>L->length + 1 || L->length >= MaxSize)
return FALSE;
i--;
for (j = L->length; j > i; j--)
{
L->data[j] = L->data[j - 1];
}
getchar(); //清空缓存区
scanf_s("%c", &e);
L->data[i] = e;
L->length++;
return TRUE;
}
int main()
{
SqList*L;
int i=0,j=0,k=0;
ElemType e;
char t,e1, e2;
InitList_Sq(L);
printf("请输入顺序表的大小:");
scanf_s("%d", &L->length);
getchar(); //清空缓存区
for (j = 0; j < L->length; ++j)
{
printf("请输入你想要插入的新的元素:");
scanf_s("%c", &t);
getchar(); //清空缓存区
ListInsert_Sq(L, j, t);
}
ListTraverse_Sq(L);
ListLength_Sq(L);
ListEmpty_Sq(L);
printf("输入你想要查找的元素的位序:");
scanf_s("%d",&i);
GetList_Sq(L,i);
printf("请输入你要查找位置的元素值:");
getchar(); //清空缓存区
scanf_s("%c", &e1);
LocateElem_Sq(L, e1);
printf("请输入你想要在哪一个位置之前插入新的元素:");
scanf_s("%d", &i);
printf("请输入你想要插入的新的元素:");
getchar(); //清空缓存区
scanf_s("%c", &e2);
ListInsert_Sq(L, i, e2);
ListTraverse_Sq(L);
printf("请输入你要删除的元素的逻辑位序:");
scanf_s("%d", &k);
ListDelete_Sq(L, k,e);
ListTraverse_Sq(L);
DestroyList_Sq(L);
system("pause");
return 0;
}
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
在调用 scanf_s()
函数时,输入字符之前可能输入了其他字符,比如回车符。回车符被读取到输入缓冲区中,在读取字符时就会将其误认为是字符输入,导致程序异常。
为解决此问题,可以在 scanf_s()
函数前面加上一个 getchar()
,将输入缓冲区中的回车符读取掉,这样就可以正常输入字符了。
修改后的代码如下:
//输入顺序表
void Input_Sq(SqList* L)
{
int j;
char t;
for (j = 0; j < L->length; ++j)
{
printf("请输入你想要插入的新的元素:");
getchar(); //读取回车符
scanf_s("%c", &t);
ListInsert_Sq(L, j, t);
}
}
int main()
{
//...
printf("请输入顺序表的大小:");
scanf_s("%d", &L->length);
Input_Sq(L); //输入顺序表
//...
}
如果我的回答解决了您的问题,请采纳!
可能的问题有以下几点:一般这种问题可能的原因是scanf获取了前面的换行符,导致没有输入,只需要在每一个scanf后面加一句代码
getchar();
记住是每一个有scanf的后面
输入字符前加上fflush(stdin):
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<stdbool.h>
#include"SqList.h"
#define TRUE 1
#define FALSE 0
#define MaxSize 10 //线性表存储空间大小
typedef char ElemType;
typedef struct {
ElemType data[MaxSize]; //存放线性表中元素
int length; //存放线性表长度
}SqList; //静态顺序表的结构体类型
//初始化
void InitList_Sq(SqList*& L)
{
L = (SqList*)malloc(sizeof(SqList));
L->length = 0;
}
//输出顺序表
void ListTraverse_Sq(SqList* L)
{
int i;
for (i = 0; i < L->length; i++)
{
printf("输出顺序表:%d ", L->data[i]);
}
printf("\n");
}
//输出顺序表的长度
int ListLength_Sq(SqList* L)
{
return (L->length);
}
//判断顺序表是否为空
bool ListEmpty_Sq(SqList* L)
{
printf("将判断顺序表是否为空:(TRUE or FALSE)");
if (L->length == 0)
return TRUE;
else
return FALSE;
}
//按位序查找元素
char GetList_Sq(SqList* L,int i)
{
scanf_s("%d", &i);
return (L->data[i]);
}
//输出元素的逻辑位置
int LocateElem_Sq(SqList* L, ElemType e)
{
int i=0;
while (i < L->length && L->data[i] != e)
i++;
if (i < L->length)
return i + 1;
else
return 0;
}
//插入元素
bool ListInsert_Sq(SqList* L, int i, ElemType e)
{
int j;
if (i<1 || i>L->length + 1 || L->length >= MaxSize)
return FALSE;
i--;
for (j = L->length; j > i; j--)
{
L->data[j] = L->data[j - 1];
}
L->data[i - 1] = e;
L->length++;
return TRUE;
}
//删除元素
bool ListDelete_Sq(SqList*& L, int i, ElemType& e)
{
int j;
if ((i < 1) || (i > L->length))
return FALSE;
i--;
e = L->data[i];
for (j = i; j < L->length - 1; j++)
{
L->data[j] = L->data[j + 1];
}
L->length--;
return TRUE;
}
//释放顺序表
void DestroyList_Sq(SqList*& L)
{
free(L);
}
int main()
{
SqList*L;
int i=0,j=0,k=0;
ElemType e;
char t,e1, e2;
InitList_Sq(L);
printf("请输入顺序表的大小:");
scanf_s("%d", &L->length);
for (j = 0; j < L->length; ++j)
{
printf("请输入你想要插入的新的元素:");
fflush(stdin);
scanf_s("%c", &t);
ListInsert_Sq(L, j, t);
}
ListTraverse_Sq(L);
ListLength_Sq(L);
ListEmpty_Sq(L);
printf("输入你想要查找的元素的位序:");
scanf_s("%d",&i);
GetList_Sq(L,i);
printf("请输入你要查找位置的元素值:");
fflush(stdin);
scanf_s("%c", &e1);
LocateElem_Sq(L, e1);
printf("请输入你想要在哪一个位置之前插入新的元素:");
scanf_s("%d", &i);
printf("请输入你想要插入的新的元素:");
fflush(stdin);
scanf_s("%c", &e2);
ListInsert_Sq(L, i, e2);
ListTraverse_Sq(L);
printf("请输入你要删除的元素的逻辑位序:");
scanf_s("%d", &k);
ListDelete_Sq(L, k,e);
ListTraverse_Sq(L);
DestroyList_Sq(L);
system("pause");
return 0;
}
在使用scanf_s函数读取字符时,可能会因为之前读取过的空格、回车等空白字符残留在输入缓冲区中,导致读取的字符不是用户输入的字符。解决方法是在读取字符前使用一个getchar()函数来将缓冲区中的空白字符读取掉。可以将以下代码:
scanf_s("%c", &t);
修改为:
scanf_s(" %c", &t);
其中 %c 表示读取一个字符,空格表示读取一个非空白字符,即可以将缓冲区中的空白字符读取掉。
不知道你这个问题是否已经解决, 如果还没有解决的话:第一种情况:
当我们scanf_s("%d%d%d",a,b,c);
如果你在键盘上输入了1 2 3(1空格2空格3),那么第一个空格就被当作字符了。要用回车,用回车,用回车。
第二种情况:
当我们scanf_s("%d,%d,%d",a,b,c);
这个时候我么就需要用逗号隔开,比如想给a输入1,b输入2,c输入3。键盘的按键顺序就是:1 逗号 2 逗号 3 Enterr
(逗号代表逗号键)。