gpt4 book ai didi

c - 运行时检查失败 #2 变量 'optionAddress' 周围的堆栈已损坏

转载 作者:行者123 更新时间:2023-11-30 16:34:42 25 4
gpt4 key购买 nike

在我的程序运行完毕之后,但在收到“按任意键继续...”提示之前,我收到了此错误。这是我的代码

#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(" %c", &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("%s", &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("%s", 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("%s", &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("%s", number.business);
break;
}

我在这里查看了其他人如何解决这个问题,但似乎这是一个内存问题或其他问题,并且每个人的情况都不同。如果我扩展程序,则在代码完成之前不会出现错误。我尝试过不使用“%s”而使用“%c”,但是当我这样做时,程序会跳过 scanf。如果我没有提供足够的信息,请告诉我。

最佳答案

I've tried it without the "%s" and with " %c" instead, but when I do that the program skips the scanf's.

使用 %s 时堆栈损坏的原因是由于在单个字符之后插入了空字符 (\0)。由于您为 optionAddress 分配的大小只是一个字符,因此您将使用比您分配的更多的字符(至少两个字符)。

因此,使用 %c 将是正确的选择,而 scanfs 的跳过可能是由于输入缓冲区中剩余的换行符所致。我不太确定哪个代码能够解决这个问题(因为我不知道跳过了多少个 scanf),但是使用 getchar() 从输入缓冲区中删除一个字符(可能是换行符),或使用 fflush(stdin) 可以帮助清除输入缓冲区。

尽管使用 fflush(stdin) 并不是一个好的做法,甚至可能无法工作,具体取决于您的环境。像您一样使用“%c”通常应该可以解决换行问题,但如果不能解决,您可以使用 getchar() 直到不再跳过 scanfs。

关于c - 运行时检查失败 #2 变量 'optionAddress' 周围的堆栈已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49227748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com