c语言编程实现电话簿的输入输出和排序
我想做一本电话簿 我的第一个问题是,当我第二次输入电话号码时,第一个电话号码会受到第二个姓名的影响,如下所示: 排序字符串还有一个额外的问题。这是我的密码:c语言编程实现电话簿的输入输出和排序,c,C,我想做一本电话簿 我的第一个问题是,当我第二次输入电话号码时,第一个电话号码会受到第二个姓名的影响,如下所示: 排序字符串还有一个额外的问题。这是我的密码: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> struct contact { char name[29]; char number[11]; }; int ma
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
struct contact {
char name[29];
char number[11];
};
int main() {
struct contact contact[100];
int menu;
int n = 0;
int i, j, flag_1, flag_2, flag_3, flag_4, loop;
char temp[29];
do {
loop = 0;
printf("Phone Book\n");
printf("==========\n");
printf("1. Add New Contact\n");
printf("2. View List Contact\n");
printf("3. Search Contact\n");
printf("4. Delete Contact\n");
printf("5. Exit\n");
printf("choose menu: ");
scanf("%d", &menu);
system("cls");
switch (menu) {
case 1:
printf("Add New Contact\n");
do {
flag_1 = flag_2 = 1;
printf("Input name [1..30 char]: ");
scanf(" %[^\n]", contact[n].name);
if (strlen(contact[n].name) > 30) {
printf("Length of name should be between 1 and 30 characters.\n");
flag_1 = 0;
}
if (!isalpha(contact[n].name[0])) {
printf("First letter of name should be an alphabet (A-Z od a-z).\n");
flag_1 = 0;
}
} while (flag_1 == 0 || flag_2 == 0);
do {
flag_3 = flag_4 = 1;
printf("Input phone number [6..12 digits]: ");
scanf("%s", contact[n].number);
if (strlen(contact[n].number) < 6 || strlen(contact[n].number) > 12) {
printf("Length of phone numbers should be between 6 and 12 digits.\n");
flag_3 = 0;
}
for (i = 0; i < strlen(contact[n].number); i++) {
if (!isdigit(contact[n].number[i])) {
flag_4 = 0;
}
}
if (flag_4 == 0) {
printf("Phone numbers should only contain digits (0-9).\n");
}
} while (flag_3 == 0 || flag_4 == 0);
printf("\n");
printf("New contact successfully added!\n\n");
printf("Name : %s\n", contact[n].name);
printf("Number : %s\n\n", contact[n].number);
printf("Press Enter to continue...");
n++;
getchar();
getchar();
system("cls");
loop = 0;
break;
case 2:
printf("View List Contact\n\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n - 1; j++) {
if (strcmp(contact[j].name, contact[j + 1].name) > 0) {
strcpy(temp, contact[j].name);
strcpy(contact[j].name, contact[j + 1].name);
strcpy(contact[j + 1].name, temp);
strcpy(temp, contact[j].number);
strcpy(contact[j].number, contact[j + 1].number);
strcpy(contact[j + 1].number, temp);
}
}
}
printf(" # Name Phone Number\n");
for (i = 0; i < n; i++) {
printf(" %d %s %s\n", i + 1, contact[i].name, contact[i].number);
}
getchar();
getchar();
system("cls");
loop = 0;
break;
}
} while (loop == 0);
getchar();
return 0;
}
#包括
#包括
#包括
#包括
结构接触{
字符名[29];
字符数[11];
};
int main(){
结构触点[100];
int菜单;
int n=0;
int i,j,flag_1,flag_2,flag_3,flag_4,loop;
煤焦温度[29];
做{
循环=0;
printf(“电话簿”);
printf(“================\n”);
printf(“1.添加新联系人\n”);
printf(“2.查看列表联系人\n”);
printf(“3.搜索联系人”);
printf(“4.删除联系人\n”);
printf(“5.退出\n”);
printf(“选择菜单:”);
scanf(“%d”,菜单(&M);
系统(“cls”);
开关(菜单){
案例1:
printf(“添加新联系人”);
做{
标志_1=标志_2=1;
printf(“输入名称[1..30字符]:”;
scanf(“%[^\n]”,联系人[n]。姓名);
如果(strlen(联系人[n].name)>30){
printf(“名称长度应介于1到30个字符之间。\n”);
标志_1=0;
}
如果(!isalpha(联系人[n].name[0])){
printf(“名字的第一个字母应该是字母表(A-Z od A-Z)。\n”);
标志_1=0;
}
}while(flag_1==0 | | flag_2==0);
做{
标志3=标志4=1;
printf(“输入电话号码[6..12位]:”;
scanf(“%s”,联系人[n]。号码);
如果(strlen(联系人[n].number)<6 | | strlen(联系人[n].number)>12){
printf(“电话号码的长度应在6到12位之间。\n”);
标志_3=0;
}
对于(i=0;i0){
strcpy(临时,联系人[j].姓名);
strcpy(联系人[j]。姓名,联系人[j+1]。姓名);
strcpy(联系人[j+1]。姓名、温度);
strcpy(温度,触点[j]。编号);
strcpy(联系人[j]。编号,联系人[j+1]。编号);
strcpy(联系人[j+1]。编号、温度);
}
}
}
printf(“姓名电话号码”);
对于(i=0;i
有人能帮我解决问题吗
注:为我的英语不好表示歉意。如评论中所示,问题是您的阅读溢出,您阅读的内容超出了为
字符编号[11]
保留的空间,因此,请一直阅读到下一个“\0”,在本例中,字符名称[29]
中的内容
在内存中,结构的形式如下:
-----------------------
| name[0] |
| ... |
| name[29] | this is the X element of contact[100]
| number[0] |
| ... |
| number[11] |
-----------------------
| name[0] |
| ... |
| name[29] | this is the X+1 element of contact[100]
| number[0] |
| ... |
| number[11] |
-----------------------
要解决此问题,您应该将字符编号[11]
的大小增加到字符编号[12]
,并(始终)自己将“\0”分配到最后一个位置
编号[11]='\0'代码>
您应该对名称执行相同的操作。这是一个很好的做法,将最大长度指定为scanf
scanf("%3s", string); -- only reads 3 caracter from the input.
编辑:添加了有关如何修复的信息。如注释中所示,问题是您的读取溢出,您读取的内容超出了为字符编号[11]
保留的空间,因此一直读取到下一个'\0',在这种情况下,字符名称[29]
中存在的内容
在内存中,结构的形式如下:
-----------------------
| name[0] |
| ... |
| name[29] | this is the X element of contact[100]
| number[0] |
| ... |
| number[11] |
-----------------------
| name[0] |
| ... |
| name[29] | this is the X+1 element of contact[100]
| number[0] |
| ... |
| number[11] |
-----------------------
要解决此问题,您应该将字符编号[11]
的大小增加到字符编号[12]
,并(始终)自己将“\0”分配到最后一个位置
编号[11]='\0'代码>
您应该对名称执行相同的操作。这是一个很好的做法,将最大长度指定为scanf
scanf("%3s", string); -- only reads 3 caracter from the input.
编辑:添加了如何修复的信息。关于代码的几点注释:
1.制作代码流程图,简要说明代码结构。这将通过跳过可能的代码重复、将多次使用的代码转换为函数或删除冗余行来帮助您降低代码复杂性和代码量
2.如果将代码分解为执行简单任务的小函数,则管理代码和检测可能的错误会容易得多。例如,可以将开头的所有打印消息放入单个函数中,如下所示:
void promt_message (void) {
printf("Phone Book\n");
printf("==========\n");
printf("1. Add New Contact\n");
printf("2. View List Contact\n");
printf("3. Search Contact\n");
printf("4. Delete Contact\n");
printf("5. Exit\n");
printf("choose menu: ");
scanf("%d", &menu);
system("cls");
}
然后将main()
中的所有这些行替换为