Run-Time Check Failure #2 - Stack around the variable 'str' was corrupted

396
30 октября 2021, 08:20

И так, после выполнения этого кода, VS возвращает ошибку

Run-Time Check Failure #2 - Stack around the variable 'str' was corrupted.

#include "conio.h"
#include "pch.h"
#include "stdio.h"
#include <locale>
int toint(char num[])
{
    int i = 0;
    if (num[i]=='+' || num[i]=='-') i++;
    int n = 0;
    while (i < strlen(num))
    {
        n*=10;
        switch (num[i])
        {
            case '0': break;
            case '1': n+=1; break;
            case '2': n+=2; break;
            case '3': n+=3; break;
            case '4': n+=4; break;
            case '5': n+=5; break;
            case '6': n+=6; break;
            case '7': n+=7; break;
            case '8': n+=8; break;
            case '9': n+=9; break;
            default: break;
        }
        i++;
    }
    if (num[0]=='-') n*=-1;
    return n;
}
bool isint(char num[])
{
    int i = 0;
    bool b = true;
    if (num[i]=='+' || num[i]=='-') i++;
    while (b && i < strlen(num))
    {
        if (isdigit(num[i])) {}
        else {b = false;}
        i++;
    }
    return b;
}
int main()
{
    setlocale(LC_ALL, "ru-RU");
    char str[8];
    bool b = true;
    do
    {
        if (!b) printf("Число указано неверно\n");
        scanf_s("%6s",str,strlen(str));
        b = isint(str);
    }
    while (!b);
    int year = toint(str);
    year -= 1984;
    while (year < 0)
        year += 60;
    int color = year % 5;
    int animal = year % 12;
    switch (color)
    {
        case 0: printf("год зелёно"); break;
        case 1: printf("год красно"); break;
        case 2: printf("год жёлто"); break;
        case 3: printf("год бело"); break;
        case 4: printf("год чёрно"); break;
        default: break;
    }
    switch (animal)
    {
        case 0: printf("й крысы"); break;
        case 1: printf("й коровы"); break;
        case 2: printf("го тигра"); break;
        case 3: printf("го кролика"); break;
        case 4: printf("го дракона"); break;
        case 5: printf("й змеи"); break;
        case 6: printf("й лошади"); break;
        case 7: printf("й овцы"); break;
        case 8: printf("й обезьяны"); break;
        case 9: printf("го петуха"); break;
        case 10: printf("й собаки"); break;
        case 11: printf("й свиньи"); break;
        default: break;
    }
    return 0;
}

Так вот, уважаемые знатоки C++, объясните, пожалуйста, для тупых, в чём тут дело

Answer 1

Исправьте

scanf_s("%6s",str,strlen(str));

на

scanf_s("%6s",str,sizeof(str)); 

И еще - простите, но зачем нужна функция toint() при наличии strtol или хотя бы atoi?

READ ALSO
С++ вывод столбцами через cout

С++ вывод столбцами через cout

Есть такая задача: сгенерировать матрицу NxN случайными числами, найти в каждом столбце полученной матрицы максимум, из выборки максимумов...

90
Не работает муравей ленгтона на c++

Не работает муравей ленгтона на c++

Написал муравья ленгтона на c++, для визуализации использовал функции winapiМуравей ходит нормально ровно до того момента когда он должен начать...

254
Книги и учебные ресурсы по фундаментальным знаниям и навыкам разработчика

Книги и учебные ресурсы по фундаментальным знаниям и навыкам разработчика

Рекомендуемая литература и документация по знаниям и навыкам разработки, не привязанным к конкретным языкам и платформам

157