【问题标题】:Access Violation Error when reading a string in C在 C 中读取字符串时出现访问冲突错误
【发布时间】:2019-04-05 16:16:57
【问题描述】:

根据书上:How to C Programming - Eighth Edition (by Deitel brothers)这段代码读的是“Hello”这个词:

#define SIZE 20

int main()
{
   char MyStr[SIZE];

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

此图来自Sixth Edition online

但是当我这样做时:

int main()
{
   char MyStr[20];

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

我收到访问冲突错误:

我做错了什么?

【问题讨论】:

  • 我推荐你read the documentation for scanf_s。这是一个特殊的函数,在某些情况下需要特殊的额外参数。
  • "scanf_s 要求为 c、C、s、S 或 [ 类型的所有输入参数指定缓冲区大小。缓冲区大小作为附加参数传递,紧随其后指向缓冲区或变量的指针。"
  • 你掉进了微软告诉你使用scanf_s 并谎称scanf 不是“安全”之类的陷阱 - 在scanfscanf_s鉴于书中的格式。
  • @Someprogrammerdude 这不是scanf_s 的文档。它位于标准的附件 K,“边界检查接口”。
  • @Lundin 不幸的是,Visual Studio 有自己的“安全”函数变体,它们与同名的标准函数相似但不同(至少它们曾经有点不同) .

标签: c arrays string character


【解决方案1】:

scanf 和 scanf_s 是有区别的。后者需要指定长度。所以你的代码应该改为:

int main()
{
   char MyStr[20];

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

int main()
{
    char MyStr[20];

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

【讨论】:

  • 我的 IDE 不允许我使用 scaf(),所以我将 size 参数添加到 scanf_s() 并且它起作用了。
  • @Lundin 是的,通过寻找更好的书使解决方案更加复杂
  • @SandraK 使用过时的编译器学习糟糕的、非标准的做法不会让你成为一个像样的 C 程序员。 Visual Studio 充其量只能算是一个 C++ 编译器。
【解决方案2】:

将 _CRT_SECURE_NO_WARNINGS 添加到链接器选项中,如果您不想使用安全方法,它应该允许您使用 scanf 和其他“不安全”方法。如果您使用安全的,Visual Studio 默认首选

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2018-08-31
    • 2013-01-30
    • 1970-01-01
    相关资源
    最近更新 更多