Ошибка проверки времени выполнения № 2 - стек вокруг переменной 'tempID' поврежден

Недавно я начал кодировать на c, и во время кодирования я столкнулся с этой ошибкой во время выполнения, которая не может найти решение. Он либо отображает эту ошибку времени выполнения, либо останавливается после scanf в случае, если клиент найден, вы выбираете, что вы хотите редактировать, а затем вводите новую информацию.

Пример:

  • введенный ID:322993
  • НАЙДЕННЫЙ
  • Нажмите [1], чтобы изменить идентификатор
  • Введите новый идентификатор
  • программа застревает

Вот код:

void modifyCustomer(){
    int counter=0;
    long int tempID=0;
    flag found = false;
    fflush(stdin);
    printf("Enter Customer ID\n");
    scanf("%lld", &tempID);
    do{
        char option_str[200];
        int option = 0;
        char *not_valid;
        if(tempID == customers[counter].customerID){
            printf("Customer found!\n");
            found = true;
            do{
                fflush(stdin);
                printf("Choose what to modify:\n 1. ID\n 2. Name\n 3. Surname\n 4. Address\n 5. Mobile\nOption: ");
                scanf("%s", &option_str);
                option = strtol(option_str, &not_valid, 10);
                fflush(stdin);
                if (*not_valid != '\0') {
                    printf("%s is not valid.\n", not_valid);
                } else{
                    switch(option){
                    case 1:
                        printf("Enter new ID:\n");
                        scanf("%d\n", &customers[counter].customerID);
                        printf("Customer Modified Successfully!\n");
                        break;
                    case 2:
                        printf("Enter new Name:\n");
                        scanf("%s\n", &customers[counter].customerName);
                        printf("Customer Modified Successfully!\n");
                        break;
                    case 3:
                        printf("Enter new Surname:\n");
                        scanf("%s\n", &customers[counter].customerSurname);
                        printf("Customer Modified Successfully!\n");
                        break;
                    case 4:
                        printf("Enter new Address:\n");
                        scanf("%s\n", &customers[counter].customerAddress);
                        printf("Customer Modified Successfully!\n");
                        break;
                    case 5:
                        printf("Enter new Mobile:\n");
                        scanf("%lld\n", &customers[counter].customerMobile);
                        printf("Customer Modified Successfully!\n");
                        break;
                    default:
                        printf("You did not enter a valid Number. Please re-enter your Input \n");
                        break;
                    }
                }
            }while((option <1) || (option > 5));
        }
        else{
            counter++;
        }
    }while((found != true) && (counter < (custNum-1)));
    if (found == false)
        printf("Customer not found!\n");
}

Почему это происходит?

1 ответ

%lld спецификатор формата для long long, Вы объявили long int Возможно, вы пытаетесь записать в больший тип, чем у вас есть хранилище. Эффект этого не определен, но запись в следующую переменную стека весьма вероятна, если sizeof(long int) != sizeof(long long) на вашей платформе.

Вы можете исправить это, изменив tempID быть типом long int или изменив спецификатор формата, который вы используете для %ld,

Другие вопросы по тегам