cexceptionscanftowers-of-hanoi

How I can solve this problem during debugging?(unhandled exception at 0xFEFEFEFE)


It seems like there is problem in scanf_s Here is my code.

#include <stdio.h>
#include "stack.h"
int main(){ 
    int disk;
    int hanoi[3][9];
    char input[3] = { 0,0,0 };
    int moveDisk;

    for (int i = 0; i < 9; i++) {
        hanoi[0][i] = i + 1;
        hanoi[1][i] = 0;
        hanoi[2][i] = 0;
    }

    printf("Insert the number of disks(1~9): ");
    scanf_s("%d", &disk);

    while (input[0] != 'q') {
        printf("%3c %3c %3c\n", 'A', 'B', 'C');
        for (int i = 0; i < disk; i++) {
            printf("%3d %3d %3d\n", hanoi[0][i], hanoi[1][i], hanoi[2][i]);
        }
        scanf_s("%s", &input); //getting moving disk -- LOCATION OF ERROR
    }
}

I have no idea how to solve this


Solution

  • No doubt you tried to use scanf() in the normal way and Visual Studio reported an error instructing you to use scanf_s()? It is not a direct replacement. For all %c, %s and %[ format specifiers you must provide two arguments - the target receiving the input, and the size of target (or strictly the number of elements).

    In VS2019 even at /W1 warning level, it issues a clear explanation of the problem in this case:

    warning C4473: 'scanf_s' : not enough arguments passed for format string
    message : placeholders and their parameters expect 2 variadic arguments, but 1 were provided
    message : the missing variadic argument 2 is required by format string '%s'
    message : this argument is used as a buffer size
    

    Don't ignore the warnings, and certainly don't disable them globally (/W0).

    So in this case:

    scanf_s("%s", input, sizeof(input) ) ;
    

    again more strictly:

    scanf_s("%s", input, sizeof(input)/sizeof(*input) ) ;
    

    but the latter is really only necessary for wscanf_s (wide characters). In both cases you could use the _countof() macro, but it is Microsoft specific.

    scanf_s("%s", input, _countof(input) ) ;
    

    Note also the lack of an & before input. You don't need it for an argument that is already array or pointer. That is true of scanf() too.

    Whilst there are arguments for using scanf_s() over scanf() (which is intrinsically more dangerous), it can just make life difficult if you are learning from standard examples or using a different toolchain. The simpler solution is just to disable the warning, and understand that it is unsafe:

    enter image description here