首页 > 其他分享 >求解!do...while 语句嵌套switch语句为何会出现死循环?

求解!do...while 语句嵌套switch语句为何会出现死循环?

时间:2024-07-24 16:29:09浏览次数:15  
标签:语句 do name ... count pc printf t% data

这是我写的一段实现通讯录的代码

void menu()
{
	printf("**************************************\n");
	printf("*******   1.Add         2.Del    *****\n");
	printf("*******   3.Search      4.Modify *****\n");
	printf("*******   5.Show        6.Sort   *****\n");
	printf("*******          0.Exit          *****\n");
	printf("**************************************\n");
}

int main()
{
	int input = 0;
	Contact con;//通讯录
	//初始化通讯录
	InitContact(&con);
	do
	{
		menu();
		printf("请选择:->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);
			break;
		case 2:
			DelContact(&con);
			break;
		case 3:
			SearchContact(&con);
			break;
		case 4:
			break;
		case 5:
			ShowContact(&con);
			break;
		case 6:
			break;
		case 0:
			printf("退出\n");
			break;
		default:
			printf("输入错误,请重新输入:->\n");
			break;
		}
	} while (input);
	return 0;
}

#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"

//初始化通讯录
void InitContact(Contact* pc)
{
	assert(pc);  //pc若为空指针 则报错
	pc->count = 0;
	memset(pc->data, 0, sizeof(pc->data));
}

//增加
void AddContact(Contact* pc)
{
	assert(pc);  //pc若为空指针 则报错
	if (pc->count == MAX)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	//
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->count].name);//name是一个数组,数组名表示地址
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->count].age)); //age是一个变量需要&传入地址
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->count].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->count].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->count].addr);
	pc->count++;
	printf("信息增加成功\n");
}


void ShowContact(const Contact* pc)
{
	assert(pc);  //pc若为空指针 则报错
	//打印
	int i = 0;
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "地址"); //- 左对齐
	for ( i = 0; i < pc->count; i++)
	{
		printf("%-20s\t%-3d\t%-5s\t%-12s\t%-30s\n",pc->data[i].name, 
											pc->data[i].age, 
											pc->data[i].sex, 
											pc->data[i].tele, 
											pc->data[i].addr);
	}
}

//查找联系人
static int FindByName(Contact* pc,char name[])
{
	assert(pc);  //pc若为空指针 则报错
	int i = 0;
	for ( i = 0; i < pc->count; i++)
	{
		if (0 == strcmp(pc->data[i].name, name)) 
		{
			return i;
		}
	}
	return -1;
}


//删除指定联系人
void DelContact(Contact* pc)
{
	assert(pc);  //pc若为空指针 则报错
	char name[MAX_NAME] = {0};
	if (pc->count == 0)
	{
		printf("通讯录为空,删除失败\n");
	}
	printf("请输入要删除的名字:>");
	scanf("%s", name);

	//删除 -->先找到
	int pos = FindByName(pc,name);
	if (pos == -1)
	{
		printf("没找到该联系人\n");
	}

	//删除
	for ( int i = pos; i < pc->count-1;  i++) //count-1 防止越界
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->count--;
	printf("删除成功\n");
}

//查找联系人
void SearchContact(Contact* pc)
{
	assert(pc);  //pc若为空指针 则报错
	char name[MAX_NAME] = { 0 };
	printf("请输入要查找的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("没找到该联系人\n");
	}
	else
	{
		printf("找到了%s,下面是该联系人的信息\n", name);
		printf("%-20s\t%-3d\t%-5s\t%-12s\t%-30s\n", pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}

我输入11,报错,此处是正常的

之后,在输入英文字母例如a之后为什么会陷入死循环,错误如下

有点不理解了,求大佬们解惑

标签:语句,do,name,...,count,pc,printf,t%,data
From: https://blog.csdn.net/tenet2022/article/details/140666197

相关文章

  • Windows使用NVM管理node.js
    NVM(NodeVersionManager)是一个开源的命令行工具,用于管理多个版本的Node.js在同一台计算机上。NVM允许开发者轻松地安装、切换和管理不同版本的Node.js,这对于在多个项目上工作或测试Node.js的不同特性时非常有用。在macOS或Linux上,通常通过curl或wget下载安......
  • NAS机友必知: 一个命令轻松搞定DockerHub被墙问题!
    最近因“不可控”之理由, DockerHub算是被全面封杀了,以前还只是污染了Web网站,现在连直接使用dockerpull都不能正常拉镜像了。如下,拉镜像一直卡在pulling阶段,重试数次后就会直接失败:这对于玩NAS的朋友来说是不可接受的(对于开发者来说简直是灾难,端午节没法过了),没了 Docker,NAS的可......
  • [c语言分支循环语句详解 -----选择结构、循环结构]
            c语言是结构化的程序设计语言,分为顺序结构、选择结构、循环结构。我们生活中的所有事情都可以用三种顺序结构表示。顺序结构顺序结构是C语言的基本结构程序由上而下运行,运行完上条语句再往下运行,平时写的程序基本都用到顺序结构。选择结构我们可以使用i......
  • Lyndon 分解 & runs
    万成章在2022年集训队论文《浅谈与Lyndon理论有关的字符串组合问题》中做过详细介绍,由于笔者太菜,这里只做简单介绍,并且不做证明。Lyndon分解Lyndon串:对于字符串\(s\),如果\(s\)的字典序严格小于\(s\)的所有后缀的字典序,我们称\(s\)是Lyndon串。Lyndon分解:串\(s\)的Lyndon分解记......
  • 使用iptables管控docker容器
    docker与iptables说明某些项目考虑到安全问题,需要启用iptables来进行加固。根据官方文档介绍(https://dockerdocs.cn/network/iptables/):在Linux上,Docker操纵iptables规则以提供网络隔离。尽管这是实现的详细信息,并且您不应修改Docker在iptables策略中插入的规则,但是如果您想要......
  • Windows Defender SmartScreen 已阻止启动一个未识别的应用
    对于软件开发者或者软件开发公司来说,发布应用程序后会面临一个难题,那就是用户在下载此应用程序时,SmartScreen会弹出“WindowsDefenderSmartScreen已阻止启动个未识别的应用,运行此应用可能会导致您的电脑面临风险” 的警告,这种警告不利于用户信任,还有可能会减少用户下载率......
  • Windows 使用 Visual Studio 2013 编译 paho-mqtt 生成dll lib 文件
    前言全局说明Windows使用VisualStudio2013编译paho-mqtt生成dlllib文件一、说明环境:Windows7旗舰版VisualStudio2013RTMPROCHS二、环境准备2.1安装VisualStudio2013https://www.cnblogs.com/wutou/p/183205322.2安装CMakehttps://www.cnblo......
  • 如何在 Linux 主机和 KVM 中的 Windows 客户机之间共享文件夹
    原文https://linux.cn/article-16023-1.html在本指南中,你将了解如何在Linux主机(例如使用KVM的Fedora、Ubuntu或LinuxMint)下运行的Windows客户机之间共享文件夹。virt-manager 应用(带有 libvirt)和软件包提供了一组灵活的工具来管理Linux中的虚拟机。它是自由开......
  • MATLAB代码|TOA/TDOA测距定位|二维|任意个锚节点
    TOA/TDOATOA(TimeofArrival)和TDOA(TimeDifferenceofArrival)是通过传播时间来确定位置的方法。换算成的单程信号传输时间τ\tauτ加上噪声......
  • 尝试在 Windows 上将 PyTorch 与 CUDA 结合使用时出现问题
    我正在编写使用Whisper的代码,我需要带有CUDA的PyTorch来提高模型执行速度,我安装了CUDA(使用nvidia-smi命令进行验证,显示我有CUDA12.6)并且我安装了PyTorch使用命令pipinstalltorchtorchvisiontorchaudio--index-urlhttps://download.pytorch.org/whl......