main函数里scanf_s("%c",&t)字符没办f法输入,断点调试时&t显示烫,求看看问题在哪?

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安生共同编写:
  • 该回答引用于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); //输入顺序表

    //...
}

如果我的回答解决了您的问题,请采纳!

可能的问题有以下几点:
1. 变量t没有初始化,导致其值不确定,可能会影响scanf_s函数的输入。
2. scanf_s函数的格式控制字符串中使用了%c,但是%c会读取输入缓冲区中的一个字符,如果输入缓冲区中没有字符,scanf_s函数会阻塞等待输入,直到有字符输入为止。因此,可能是输入缓冲区中没有字符,导致scanf_s函数一直等待输入。
3. scanf_s函数的第二个参数&t是一个字符类型的指针,如果&t指向的内存地址不合法,可能会导致scanf_s函数无法正确地将输入字符存储到&t指向的内存地址中。
针对以上问题,可以尝试以下解决方案:
1. 在使用变量t之前,先将其初始化为一个合法的值,例如0。
2. 在使用scanf_s函数之前,可以先使用getchar函数清空输入缓冲区中的字符,避免scanf_s函数阻塞等待输入。
3. 确认&t指向的内存地址是合法的,可以使用printf函数输出&t的值,检查其是否正确。如果&t指向的内存地址不合法,可以尝试使用动态内存分配函数malloc分配一块合法的内存空间,并将&t指向该内存地址。

一般这种问题可能的原因是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 表示读取一个字符,空格表示读取一个非空白字符,即可以将缓冲区中的空白字符读取掉。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/164840
  • 你也可以参考下这篇文章:C语言中的scanf与scanf_s 以及循环使用scanf_s进行输入时的问题解决
  • 除此之外, 这篇博客: C语言scanf_s()函数的用法中的 键盘响应输入的问题 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    第一种情况:
    当我们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
    (逗号代表逗号键)。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^