Структура С, нарушение прав доступа при записи

Рейтинг: 1Ответов: 2Опубликовано: 11.04.2015

При добавлении имени пишет, нарушение прав доступа при записи, а при добавлении телефона не работает иф, пишет введите номер, хотя ввожу его правильно

struct TB  
{  
    char name[11];   
    char surname[21];   
    char number[13];  
    bool flag;  
}list[20];  

   void add(TB*zapis)  
{  
    for (int i = 0; i<20; ++i)  
    {  
        if (zapis[i].flag == false)  
        {  
            char number[13];  
            printf("Vvedite imja: \n");  
            scanf_s("%s", zapis[i].name);  
            while (strlen(zapis[i].name)>10)  
            {  
                printf("error!Vvedite povtorno \n");  
                scanf_s("%s", &zapis[i].name);  
            }  
            printf("Vvedite familiju: \n");  
            scanf_s("%s", &zapis[i].surname);  
            while (strlen(zapis[i].surname)>20)  
            {  
                printf("error!Vvedite povtorno \n");  
                scanf_s("%s", &zapis[i].surname);  
            }  

            printf("Vvedite nomer telephona: \n");
            scanf_s("%s", &number);

            while (strlen(number)>12)
            {
                printf("error!vvedite povtorno \n");
                scanf_s("%s", &number);


            }
            for (int j = 0; j<12; ++j)
            {


                if (isdigit(number[j]) == 0)
                {
                    printf("Don't type number like this!vvedite nomer! \n");
                    scanf_s("%s", &number);

                }

            }
            for (int j = 0; j<20; ++j)
            {
                if (strcmp(number, zapis[j].number) == 0 && (zapis[j].flag == true))
                {
                    printf("Takoyi nomer est' \n");
                    return;

                }
                else
                    strcpy_s(zapis[i].number, number);

            }
            zapis[i].flag = true;
            break;
        }
    }
    printf("Your register sucessfully added! \n");
    system("pause");

}

Ответы

▲ 2

Если это вижуал студия, тогда и ответ @zenden2k также не совсем правильный. Согласно документации, scanf_s будет иметь ещё один параметр - фактический размер буфера. Итого, правильно так

scanf_s("%s", number, 13);

или даже лучше так

scanf_s("%s", number, _countof(number));
▲ 1

Неправильно используете scanf. Надо так:

scanf_s("%s", zapis[i].name);
scanf_s("%s", number);

т.е. без амперсанда для строк