在C中读取字符串时发生访问冲突错误

在C中读取字符串时发生访问冲突错误,c,arrays,string,character,C,Arrays,String,Character,根据书:如何进行C编程-第八版(Deitel brothers)这段代码读到了“Hello”这个词: #define SIZE 20 int main() { char MyStr[SIZE]; printf("Enter your word: "); scanf("%19s", MyStr); } int main() { char MyStr[20]; printf("Enter your word: "); scanf_s("%19s", MyS

根据书:
如何进行C编程-第八版(Deitel brothers)
这段代码读到了“Hello”这个词:

#define SIZE 20

int main()
{
   char MyStr[SIZE];

   printf("Enter your word: ");
   scanf("%19s", MyStr);
}
int main()
{
   char MyStr[20];

   printf("Enter your word: ");
   scanf_s("%19s", MyStr);
}
此图片来自:

#define SIZE 20

int main()
{
   char MyStr[SIZE];

   printf("Enter your word: ");
   scanf("%19s", MyStr);
}
int main()
{
   char MyStr[20];

   printf("Enter your word: ");
   scanf_s("%19s", MyStr);
}

但当我这样做时:

#define SIZE 20

int main()
{
   char MyStr[SIZE];

   printf("Enter your word: ");
   scanf("%19s", MyStr);
}
int main()
{
   char MyStr[20];

   printf("Enter your word: ");
   scanf_s("%19s", MyStr);
}
我收到访问冲突错误:

#define SIZE 20

int main()
{
   char MyStr[SIZE];

   printf("Enter your word: ");
   scanf("%19s", MyStr);
}
int main()
{
   char MyStr[20];

   printf("Enter your word: ");
   scanf_s("%19s", MyStr);
}


我做错了什么?

scanf和scanf\s之间有区别。后者要求指定长度。因此,您的代码应更改为:

int main()
{
   char MyStr[20];

   printf("Enter your word: ");
   scanf_s("%19s", MyStr, sizeof(MyStr));
}


在链接器选项中添加_CRT_SECURE_NO_警告,如果您不想使用安全的方法,它应该允许您使用scanf和其他“不安全”的方法。默认情况下,如果您使用安全的Visual Studio,则会首选它

我建议您。这是一个特殊的函数,在某些情况下需要特殊的额外参数。“
scanf_s
要求为c、c、s、s或[]类型的所有输入参数指定缓冲区大小。缓冲区大小作为附加参数在指向缓冲区或变量的指针后立即传递。”你已经落入了微软告诉你使用
scanf\u s
的陷阱,并且谎称
scanf
不“安全”诸如此类-根据本书的格式,
scanf
scanf_
之间的安全性没有变化。@一些编程人员说,这不是
scanf_
的文档。可以在标准的附录K中找到“边界检查接口”。@Lundin不幸的是,Visual Studio有自己的版本“safe”函数,与同名的标准函数相似但不相同(至少以前有点不同)。我的IDE不允许我使用scaf(),因此我将size参数添加到scanf_s()中是的,找到了一个更好的解决方案,使解决方案更加复杂book@SandraK用过时的编译器学习不好的、不规范的练习不会使你成为一个合格的C程序员。VisualStudio最好被视为C++编译器。