whlie死循环被中断问题和乱码问题

️luckychen 2019-02-10 10:34:53
#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"};

int _tmain(int argc, _TCHAR* argv[])
{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);
for(int i=0;i<999;i++)
{int choose=0;
printf("\n1插入\n2查询\n3修改\n4删除\n5显示\n");
scanf_s("%d",&choose);
switch(choose)
{case 1:insert(guestlist);break;
case 2:search(guestlist);break;
case 3:update(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_s("%c,%c,%d,%c",p[i].name,p[i].telephone,&p[i].sum,p[i].time);

}
void search(struct gues *p)
{char tele[20];
printf("输入电话号码");
gets_s(tele);
getchar();
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].sum,guestlist[i].telephone,guestlist[i].time);
}
if(flag=0)
printf("没有查询到可以修改的信息");
else
printf("客人资料为上述");
}
void update(struct gues *p)
{printf("输入电话号码");
char phone[20];
getchar();
gets_s(phone);
int i;
for(i=0;i<max;i++)
if(strcmp(p[i].telephone,phone)==0)
printf("请输入重新修改后的所有数据(用逗号分开)");
scanf_s("%c,%c,%d,%c",p[i].name,p[i].telephone,&p[i].sum,p[i].time);
getchar();
} 只是部分代码 本人新手大佬们勿喷 多多见谅 蟹蟹


1.执行第一个函数后直接跳出循环体,提示请按任意键结束
2.第二个函数结果出现代码如图

3.第三个函数输入后直接。。。

...全文
1176 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2019-02-14
  • 打赏
  • 举报
回复
https://blog.csdn.net/weixin_39886407/article/details/87206034
qq_37547597 2019-02-13
  • 打赏
  • 举报
回复
谢谢,很有帮助
gslxhanbing 2019-02-13
  • 打赏
  • 举报
回复
学习了,谢谢分享
gzhguoguohong 2019-02-12
  • 打赏
  • 举报
回复
还是习惯看JAVA code.
晗生缘 2019-02-12
  • 打赏
  • 举报
回复
楼主,你的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--; } } }
双木彡 2019-02-12
  • 打赏
  • 举报
回复
厉害了啊楼主
️luckychen 2019-02-11
  • 打赏
  • 举报
回复
#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);
}
}




以上是修改过的代码在执行第四个函数时又是直接跳出循环 还想请问下各位原因在哪


️luckychen 2019-02-11
  • 打赏
  • 举报
回复
非常感谢两位
自信男孩 2019-02-11
  • 打赏
  • 举报
回复
基础知识还需要加强呢,代码不要写的那么紧凑,不利于阅读和查找问题。
自信男孩 2019-02-11
  • 打赏
  • 举报
回复
 //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);
}
636f6c696e 2019-02-11
  • 打赏
  • 举报
回复
先学会自己调试,不然有的是苦吃
提及 2019-02-10
  • 打赏
  • 举报
回复
必要时请参考 https://paste.ubuntu.com/p/5kqV63S44H/
提及 2019-02-10
  • 打赏
  • 举报
回复
还有为什么要在函数作用域内进行函数声明
提及 2019-02-10
  • 打赏
  • 举报
回复


问题有点多

1. 新手不要省略 {}
2. 注意 scanf 的 % 后面应该接什么
3. 注意 if 中 = 符号
4. 注意使用 break
5. %s,%s,%s 并不会以 ,进行分割
6. 处理 scanf 后的回车,有一个更好的方法 scanf("%s%*c", phone);
7. %s 推荐设置最大域宽
8. 注意 ; 的使用
️luckychen 2019-02-10
  • 打赏
  • 举报
回复
这个第二个问题的图 发漏了 见谅

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧