C语言scanf与scanf_s

我打编译器是microsoft visual studio 2005,我的源程序如下,注意注释的地方,就是scan函数中的scanf_s函数,程序运行正常,但是当输入字符串大于或等于8个字符时,链表的输出就不正常了,7个以下是正常的,其他的不改变,单单把scanf_s改为scanf可以解决这个问题,但是系统又会给一个警告。。。。要怎么解决啊。。要正常又没警告的。
scanf_s#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 1000
typedef struct LNode
{ char data;
struct LNode *next;
}LinkList;

typedef struct
{
char elem[MAXSIZE];
int top;
}SqStack;

int main()
{ LinkList *CreateList(LinkList *L,char a[],int n);
void scan(char a[]);
void display(LinkList *L);
char a[MAXSIZE];
LinkList *L;
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
scan(a);
L=CreateList(L,a,strlen(a));
display(L);
return 1;
}
LinkList *CreateList(LinkList *L,char a[],int n)
{
LinkList *s,*r;
int i;
r=L;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
return L;
}

void scan(char a[])
{
scanf_s("%s",a);//这一行
}
void display(LinkList *L)
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%c",p->data);
printf("1\n");//test
p=p->next;
}
printf("\n");
}
关键是用scanf_s的话不正常。。。

第1个回答  2020-05-06
ANSI
C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内在泄露。所以vc++2005/2008中提供了scanf_s(),在调用时,必须提供一个数字以表明最多读取多少位字符。
第2个回答  2019-09-26
二者的区别与
strcpy

strncpy
的区别一样
scanf_s提供更安全一些的机制
,以防止溢出
,对于
%s
,
%s

,变量地址后要紧跟一个参数,以表示其大小,如:
wchar_t
ws[10];
scanf_s("%s",
ws,
10);
第3个回答  2008-10-30
void scan改成这个
void scan(char **a)
{
scanf("%s",*a);
}
调用时用scan(&a);应该就可以了吧,这里的指针是局部值,用指针的指针来传递指针的值试试本回答被网友采纳
第4个回答  2008-10-30
因为vs系列的是c++编译器,cin比scanf之类的更安全,如果你纯c编程用scanf在这个环境下,自然要有警告,办法是用cin,或者换c的编译器。
第5个回答  2008-10-31
sas
相似回答