春风吹又生.c 2023-10-15 11:06 采纳率: 53.1%
浏览 7
已结题

scanf_s没有执行就结束了。

为什么执行scanf_s输入数据时是错的,没有给输入直接就结束了程序


#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define STACK_INT_SIZE 10  /*存储空间初始分配量*/
#define STACKINCREMENT 5  /*存储空间分配增量*/

typedef  int ElemType; /*定义元素的类型*/

typedef struct 
{
    ElemType* base;
    ElemType* top;
    int stacksize;     /*当前已分配的存储空间*/
}SqStack;

int InitStack(SqStack* S);   /*构造空栈*/
int push(SqStack* S, ElemType e); /*入栈*/
int Pop(SqStack* S, ElemType* e);  /*出栈*/
int CreateStack(SqStack* S);     /*创建栈*/
void PrintStack(SqStack* S);   /*出栈并输出栈中元素*/

int InitStack(SqStack* S) 
{
    S->base = (ElemType*)malloc(STACK_INT_SIZE * sizeof(ElemType));
    if (!S->base) return ERROR;
    S->top = S->base;  //将top初始化为base
    S->stacksize = STACK_INT_SIZE;
    return OK;
}

int Push(SqStack* S, ElemType e)    //插入元素e为新的栈顶元素
{
    if (S->top - S->base == S->stacksize) return ERROR;
    *S->top++ = e;
    return OK;


}

int Pop(SqStack* S, ElemType* e)  //弹出栈顶元素,用e返回
{
    if (S->top ==S->base ) return ERROR;
    *e = *--S->top;
    return OK;
}

int CreateStack(SqStack* S)
{
    int e;
    if (InitStack(S))
        printf("Init Success!\n");
    else
    {
        printf("Init Fail!\n");
        return ERROR;
    }
    printf("input data:(Terminated by inputing a character)\n");
    while (scanf_s("%d", &e))
        Push(S, e);
    return OK;
}



void PrintStack(SqStack* S)
{
    ElemType e;
    while (Pop(S, &e))
        printf("%3d", e);
}



//编写一个十进制转换为二进制的数制转换算法函数(要求利用栈来实现),并验证其正确性。

void conver(SqStack *S,int N)
{
    ElemType e;
 
    InitStack(S);
    while (N)
    {
        Push(S,N%2);
        N = N / 2;
    }
    while (S->top!=S->base)
    {
        Pop(S, &e);
        printf("3%d",e);
    }
   
}


int main() 
{
    SqStack ss;
    int n;
    printf("\n1-createStack\n");
    CreateStack(&ss);
    printf("\n2-Pop&Print\n");
    PrintStack(&ss);


    printf("\n100转换后的数:\n");
    scanf_s("%d",&n);
    conver(&ss, n);
   
   
   
    return 0;
}

  • 写回答

2条回答 默认 最新

  • 易只轻松熊 2023-10-15 11:12
    关注

    在执行scanf_s输入数据时遇到问题,可能是因为该函数需要一个指向缓冲区的指针作为第二个参数,以及需要指定最大输入的字符数。如果不提供这些参数,函数可能会在读取输入时发生错误。
    在你的代码中,scanf_s("%d", &e)没有提供缓冲区的大小,这可能导致函数读取过多的数据,超出缓冲区大小,从而引发错误。
    在C语言中,当使用scanf_s函数时,需要指定最大读取的字符数。例如,如果想读取一个整数,并且知道这个整数不会超过10个字符(包括数字和'\0'字符),那么应该这样写:

    scanf_s("%d", &e, 11);  // 11是因为'1'到'9'加上'\0'总共需要11个字符
    

    因此,为了修复你的代码,应该在使用scanf_s函数时提供缓冲区大小。例如:

    scanf_s("%d", &e, 20);  // 这里假设输入的整数不会超过20位
    

    在这里,我选择了20作为缓冲区大小,因为大多数现代系统都使用64位整数,这意味着最大可能的大小是2^64,这远超过20。然而,这只是一个例子,应该基于你的实际需求来选择适当的缓冲区大小。
    另外需要注意的是,虽然scanf_s比scanf更安全,但它在一些旧的编译器中可能不被支持。如果遇到编译问题,可以考虑使用fgets和sscanf组合来代替scanf_s。例如:

    fgets(buffer, 20, stdin);  
    sscanf(buffer, "%d", &e);
    

    在这里,我们从用户输入中读取最多20个字符,并将其存储在buffer中,然后使用sscanf从buffer中解析整数。这样也可以避免scanf_s可能遇到的问题。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月30日
  • 创建了问题 10月15日