代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

扫描抛出异常

  •  3
  • Tony The Lion  · 技术社区  · 14 年前

    为什么下面的代码在到达第二个时抛出异常 scanf_s 输入要放入结构中的数字后。

    这绝不代表一个完整的链表实现。

    不知道如何进入下一个 斯坎夫斯 什么时候输入了值?有什么想法吗?

    编辑:使用建议的解决方案更新了代码,但仍然获得 AccessViolationException 先后 斯坎夫斯

    代码:

    struct node
    {
        char name[20];
        int age;
        float height;
        node *nxt;
    };
    
    int FillInLinkedList(node* temp)
    {
    
    int result;
    temp = new node;
    
    printf("Please enter name of the person");
    result = scanf_s("%s", temp->name);
    
    printf("Please enter persons age");
    result = scanf_s("%d", &temp->age); // Exception here...
    
    printf("Please enter persons height");
    result = scanf_s("%f", &temp->height);
    
    temp->nxt = NULL;
    if (result >0)
        return  1;
     else return 0;
    }
    
    // calling code
    
    int main(array<System::String ^> ^args)
    {
      node temp;
    
      FillInLinkedList(&temp);
    
    ...
    
    5 回复  |  直到 14 年前
        1
  •  3
  •   Martin B    14 年前

    你需要

    result = scanf_s("%d", &temp->age);
    

    result = scanf_s("%f", &temp->height);
    

    原因是 sscanf (和朋友)需要 指针 到输出变量,以便它可以在那里存储结果。

    顺便说一句,参数也有类似的问题 temp 你的职责。由于要更改指针(而不仅仅是指针指向的内容),因此需要传递一个双指针,以便更改在函数外部可见:

    int FillInLinkedList(node** temp)
    

    当然,您必须在函数内部进行必要的更改。

        2
  •  5
  •   shf301    14 年前

    您使用的扫描单元参数不正确。请看一下 MSDN documentation 为了这个功能。它要求在缓冲区之后传递所有字符串或字符参数的缓冲区大小。所以

    result = scanf_s("%s", temp->name); 
    

    应该是:

     result = scanf_s("%s", temp->name, 20);
    

    对scanf_s的第一个调用是从堆栈中读取垃圾,因为它正在寻找另一个参数,可能会损坏内存。

    没有编译器错误,因为scanf_使用变量参数列表-函数没有固定数量的参数,所以编译器不知道scanf_期望的是什么。

        3
  •  2
  •   N 1.1    14 年前

    scanf()将数据存储到变量中,因此需要传递变量(或其指针)的地址。
    例子:

    char string[10];
    int n;
    scanf("%s", string); //string actually points to address of
                         //first element of string array
    scanf("%d", &n); // &n is the address of the variable 'n'
    
        4
  •  1
  •   Paul R    14 年前
    • %19c 应该是 %s

    • temp->age 应该是 &temp-age

    • temp->height 应该是 &temp->height

    • 你的编译器应该警告你 关于这些错误

        5
  •  1
  •   Ferruccio    14 年前

    我相信您需要按地址将参数传递给scanf()函数。即温度-年龄

    否则,临时年龄将被解释为一个指针,这将最有可能使您的程序崩溃。