程序在编译结束时崩溃

时间:2018-03-13 03:55:26

标签: c struct scanf

我有一个程序用于获取输入并将其存储到结构中。结构用于联系人详细信息,姓名,地址和电话号码。我的程序运行得很好,我可以将所有信息输入到程序中,但是当我尝试printf结果时程序崩溃了一半。我认为他们可能是记忆或腐败或其他问题。我认为它可能与腐败有关的原因是因为如果我切断了我的一些程序并编译它,而不是程序崩溃我得到'运行时检查失败#2变量'optionAddress'周围的堆栈已损坏'错误。这是我的程序

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include "contacts.h"
int main(void)
{
    // Declare variables here:

    struct Name names;
    char optionName;
    struct Address addresses;
    char optionAddress;
    struct Numbers number;
    char optionCell;
    char optionHome;
    char optionBusiness;

    // Display the title

    printf("Contact Management System\n");
    printf("-------------------------\n");

    // Contact Name Input:

    printf("Please enter the contact's first name: ");
    scanf("%s", &names.firstName);
    printf("Do you want to enter a middle initial(s)? (y or n): ");
    scanf("%s", &optionName);
    while (optionName == 'y' || optionName == 'Y') {
        printf("Please enter the contact's middle initial(s): ");
        scanf("%s", &names.middleInitial);
        break;
    }
    printf("Please enter the contact's last name: ");
    scanf("%s", &names.lastName);

    // Contact Address Input:

    printf("Please enter the contact's street number: ");
    scanf("%s", &addresses.streetNumber);
    printf("Please enter the contact's street name: ");
    scanf("%s", &addresses.street);
    printf("Do you want to enter an apartment number? (y or n): ");
    scanf("%s", &optionAddress);
    while (optionAddress == 'y' || optionAddress == 'Y') {
        printf("Please enter the contact's apartment number: ");
        scanf(" %c", &addresses.apartmentNumber);
        break;
    }
    printf("Please enter the contact's postal code: ");
    scanf("%s", &addresses.postalCode);
    printf("Please enter the contact's city: ");
    scanf("%s", &addresses.city);

    // Contact Numbers Input:

    printf("Do you want to enter a cell phone number? (y or no): ");
    scanf("%s", &optionCell);
    while (optionCell == 'y' || optionCell == 'Y') {
        printf("Please enter the contact's cell phone number: ");
        scanf(" %c", number.cell);
        break;
    }
    printf("Do you want to enter a home phone number? (y or n): ");
    scanf("%s", &optionHome);
    while (optionHome == 'y' || optionHome == 'Y') {
        printf("Please enter the contact's home phone number: ");
        scanf(" %c", &number.home);
        break;
    }
    printf("Do you want to enter a business phone number? (y or n): ");
    scanf("%s", &optionBusiness);
    while (optionBusiness == 'y' || optionBusiness == 'Y') {
        printf("Please enter the contact's business phone number: ");
        scanf(" %c", number.business);
        break;
    }

    // Display Contact Summary Details

    printf("Contact Details\n");
    printf("---------------\n");
    printf("Name Details\n");
    printf("First name: ");
    printf("%s", names.firstName);
    printf("\nMiddle initials(s): ");
    printf("%s", names.middleInitial);
    printf("\nLast name: ");
    printf("%s", names.lastName);
    printf("\n\nAddress Details\n");
    printf("Street number: ");
    printf("%s", addresses.streetNumber);
    printf("\nStreet name: ");
    printf("%s", addresses.street);
    printf("\nApartment: ");
    printf("%s", addresses.apartmentNumber);
    printf("\nPostal code: ");
    printf("%s", addresses.postalCode);
    printf("\nCity: ");
    printf("%s", addresses.city);
    printf("\n\nPhone Numbers: ");
    printf("\nCell phone number: ");
    printf("%s", number.cell);
    printf("\nHome phone number: ");
    printf("%s", number.home);
    printf("\nBusiness phone number: ");
    printf("%s", number.business);

    // Display Completion Message

    printf("\n\nStructure test for Name, Address, and Numbers Done!");

    return 0;
}

头文件中的结构:

// Structure type Name declaration
struct Name {
    char firstName[31];
    char middleInitial[7];
    char lastName[36];
};

// Structure type Address declaration
// Place your code here...

 struct Address {
    char streetNumber;
    char street[41];
    char apartmentNumber;
    char postalCode[8];
    char city[41];
 };

 // Structure type Numbers declaration
 // Place your code here...

 struct Numbers {
    char cell[21];
    char home[21];
    char business[21];   
 };

我的程序到达打印出"Street number: "然后停止工作。它是一个显示的Windows错误窗口,而不是编译器窗口。

2 个答案:

答案 0 :(得分:2)

  

我的程序达到了打印输出的程度&#34;街道号码:&#34;然后   停止工作。

看看:

 struct Address {
    char streetNumber;    // declared as character!
    char street[41];
    char apartmentNumber; // character
    char postalCode[8];
    char city[41];
 };

char optionName;
char optionAddress;
char optionCell;
char optionHome;
char optionBusiness;

稍后您尝试读取字符值:

scanf("%s", &optionName);
scanf("%s", &optionAddress);
scanf("%s", &optionCell);
scanf("%s", &optionHome);
scanf("%s", &optionBusiness);

scanf("%s", &addresses.streetNumber); // <-------------- string read

使用字符串格式%s。这会调用UB,因为您至少读取2个字节。 "y"是一个包含字符串null终结符'\0'的字符串。额外的字节会覆盖内存位置。 将变量声明更改为字符串或将格式读取为字符读取,如您在此处所做的那样:

  scanf(" %c", &addresses.apartmentNumber);

答案 1 :(得分:1)

scanf("%s", &optionName);

这会导致未定义的行为导致运行时错误,因为optionNamechar一个字节,scanf()%s会尝试写'\0'肯定会超越界限