user-0 提问: whlie死循环被中断问题和乱码问题

回复:
user: user-1
content: https://blog.csdn.net/weixin_39886407/article/details/87206034

user: user-2
content: 谢谢，很有帮助

user: user-3
content: 学习了，谢谢分享

user: user-4
content: 还是习惯看JAVA code.

user: user-5
content: 楼主，你的Delete函数出错了，请注意分清结构体数组的含义，你的函数逻辑是将某一结构体数组清0，但清0后，这个数组还是存在的，只是值是0，如果你要实现删除功能，需要后面的数组覆盖要删除的数组，再减1，还有请注意strcpy的用法,它针对的字符串，你直接写“0”是不行的，代码如下: void Delete(struct gues *p) { 	int i,k=0,j; 	char phone[20];  	printf("输入电话号码"); 	gets(phone);  	for (i = 0; i < max; i++) 	{ 		if (strcmp(p[i].telephone, phone) == 0) 		{ 			k = i; 			printf("k=%d\n",k); 			for (j = k; j < max; j++) 			{ 				strcpy(p[j].name, p[j + 1].name); 				printf("%s\n", p[j].name); 				p[j].sum = p[j + 1].sum; 				strcpy(p[j].telephone, p[j + 1].telephone); 				strcpy(p[j].time, p[j + 1].time); 			} 			num--; 		} 	}	 }

user: user-6
content: 厉害了啊楼主

user: user-0
content: #include "stdafx.h" #include "string.h" #include "stdlib.h" #define max 5 int num=5; struct gues { 	char name[20]; 	char telephone[20]; 	int sum; 	char time[10]; } guestlist[max]= {"zhanglin","1234567891",5,"11.30",                    "liyong","1234567892",3,"12.30",                    "liuying","1234567893",6,"12.00",                    "zhaopeng","1234567894",4,"12.20",                    "moqing","1234567895",7,"11.50"                   };  void insert(struct gues *p); void search(struct gues *p); void update(struct gues *p); void Delete(struct gues *p); void show(struct gues *p);  int main(int argc, char* argv[])  { 	for(int i=0; i<999; i++)  	 { 		int choose=0; 		printf("\n1插入\n2查询\n3修改\n4删除\n5显示\n"); 		scanf("%1d%*c",&choose); 		switch(choose) 		{ 		case 1: 			insert(guestlist); 			break; 		case 2: 			search(guestlist); 			break; 		case 3: 			update(guestlist); 			break; 	    case 4: 			Delete(guestlist);break; 	    case 5: 			show(guestlist);break;        } 	 } 	return 0; } void insert(struct gues *p) { 	int i; 	if(num=5) 		printf("无多余餐桌"); 	else 		for(i=0; p[i].sum=0; i++) 			{printf("分别输入名字，电话，人数，时间（用空格分开）"); 	scanf("%19s,%19s,%d,%9s",p[i].name,p[i].telephone,&p[i].sum,p[i].time); 	} } void search(struct gues *p) { 	char tele[20]; 	printf("输入电话号码"); 	scanf("%19s%*c", tele); 	//gets(tele); 	int i; 	int flag=0; 	for(i=0; i<max; i++) { 		if(strcmp(p[i].telephone,tele)==0) { 			flag=1; 			printf("%s\n%s\n%d\n%s\n",guestlist[i].name,guestlist[i].telephone,guestlist[i].sum,guestlist[i].time);  			break; 		} 	} 	if(flag == 0) 		printf("没有查询到可以修改的信息"); 	else 		printf("客人资料为上述"); } void update(struct gues *p) { 	printf("输入电话号码"); 	char phone[20]; 	gets(phone); 	int i; 	for(i=0; i<max; i++) { 		if(strcmp(p[i].telephone,phone)==0) { 			printf("请输入重新修改后的所有数据(用空格分开)"); 			scanf("%19s %19s %d %9s%*c",p[i].name,p[i].telephone,&p[i].sum,p[i].time); 		} 	} } void Delete(struct gues *p) {printf("输入电话号码"); 	char phone[20]; 	gets(phone); 	int i;   for(i=0;i<max;i++) 	  if(strcmp(p[i].telephone,phone)==0)  	  {strcpy_s(p[i].name,0);        strcpy_s(p[i].telephone,0);        p[i].sum=0;        strcpy_s(p[i].time,0);        num=num-1;       break;} } void show(struct gues *p)    {int i;          for(i=0;i<max;i++)           {printf("%s\n,%s\n,%d\n,%s\n",p[i].name,p[i].telephone,p[i].sum,p[i].time);           }    }     以上是修改过的代码在执行第四个函数时又是直接跳出循环   还想请问下各位原因在哪

user: user-0
content: 非常感谢两位

user: user-7
content: 基础知识还需要加强呢，代码不要写的那么紧凑，不利于阅读和查找问题。

user: user-7
content: //if(num=5)     if(num == 5)         printf("无多余餐桌");     else         //for(i=0;p[i].sum=0;i++)         for(i=0;p[i].sum==0;i++)             printf("分别输入名字，电话，人数，时间（用逗号分开）"); 看一下注释掉和新的代码的，比较一下是否能够看到问题所在。如下一样的问题：  //if(flag=0)     if(flag==0)  如下的逻辑是不是有问题，应该加上一个大括号吧   for(i=0;p[i].sum==0;i++) {             printf("分别输入名字，电话，人数，时间（用逗号分开）");     scanf_s("%c,%c,%d,%c",p[i].name,p[i].telephone,&p[i].sum,p[i].time); }

user: user-8
content: 先学会自己调试，不然有的是苦吃

user: user-9
content: 必要时请参考 https://paste.ubuntu.com/p/5kqV63S44H/

user: user-9
content: 还有为什么要在函数作用域内进行函数声明

user: user-9
content: 问题有点多  1. 新手不要省略 {} 2. 注意 scanf 的 % 后面应该接什么 3. 注意 if 中 = 符号 4. 注意使用 break 5. %s,%s,%s 并不会以 ，进行分割 6. 处理 scanf 后的回车，有一个更好的方法 scanf("%s%*c", phone); 7. %s 推荐设置最大域宽 8. 注意 ; 的使用

user: user-0
content: 这个第二个问题的图  发漏了  见谅