我是C的新手,我正在尝试创建典型的初学者电话簿应用。我在谷歌上看到很多不同的链接,显示电话簿应用程序的示例,但没有任何显示我想要完成的内容。基本上我想要做的是创建一个具有名字,姓氏和2个电话号码的结构,然后我想为每个人创建2个不同的功能。对于结构中的每个变量,我将有一个设置输入,然后另一个读取输入。这给了我8个功能,但后来又想添加三个功能,一个用于向结构添加11个新合同,一个用于删除联系人,另一个用于查看电话簿。现在我专注于添加功能和查看功能。我的问题是我的输出非常奇怪。
#include<stdio.h>
#include<conio.h>
typedef struct friends_contact{
char First_Name[10];
char Last_Name[10];
char home[15];
char cell[15];
}fr;
void menu(fr*friends ,int* counter,int user_entry, char* nullStr,int i);
void setFirst(fr*,int *,int i);
char getFirst(fr*,int*,char*,int i);
void setLast(fr*friends, int* counter, int i);
char getLast(fr*friends ,int* counter,char *nullStr, int i);
void add_contact(fr*friends,int* counter,int i);
void show_contact(fr*friends ,int* counter,char *nullStr, int i);
int main()
{
int user_entry=0;
fr friends[5];
int counter=0;
char nullStr[21] = {"\0"};
int i=0;
menu(friends, &counter,user_entry,nullStr,i);
getch();
return 0;
}
void menu(fr*friends,int* counter,int user_entry,char *nullStr,int i)
{
do{
printf("Phone Book Application\n");
printf("1) Add friend\n2) Delete friend\n3) Show a friend\n4) Show phonebook\n5)Exit);
scanf("%d", &user_entry);
if(user_entry==1){
add_contact(friends,counter,i);
}
if(user_entry==4){
show_contact(friends, counter,nullStr,i);
}
}while(user_entry!=5);
}
void setFirst(fr*friends, int* counter, int i)
{
(*counter)++;
printf("Enter a first name \n");
scanf("%s",&friends[*counter-1].First_Name);
}
void setLast(fr*friends, int* counter, int i)
{
(*counter)++;
printf("Enter a first name \n");
scanf("%s",&friends[*counter-1].Last_Name);
}
char getFirst(fr*friends ,int* counter,char *nullStr, int i)
{
for(i=0; i<*counter; i++)
{
if (strcmp(nullStr, friends[i].First_Name) != 0)
{
printf("%s\n", friends[i].First_Name);
}
}
return *friends[i].First_Name;
}
char getLast(fr*friends ,int* counter,char *nullStr, int i)
{
for(i=0; i<*counter; i++)
{
if (strcmp(nullStr, friends[i].Last_Name) != 0)
{
printf("%s\n", friends[i].Last_Name);
}
}
return *friends[i].Last_Name;
}
void add_contact(fr*friends,int* counter,int i)
{
setFirst(friends,counter,i);
setLast(friends,counter,i);
}
void show_contact(fr*friends ,int* counter,char *nullStr, int i)
{
getFirst(friends,counter,nullStr,i);
getLast(friends,counter,nullStr,i);
}
以下是我现在得到的输出:
Enter a first name
john
Enter a first name
smith
Phone Book Application
1) Add friend
2) Delete friend
3) Show a friend
4) Show phone book
5) Exit
4
john
╝ ♠
smith
当我在列表中添加其他名称时,我的结果同样奇怪。奇怪的是我在创建姓氏函数后才开始遇到这些问题。当我输入名字时它工作得很好。有什么想法吗?
答案 0 :(得分:0)
你的问题是:
1)在函数setFirst scanf("%s",&friends[*counter-1].First_Name);
中
2)在函数setLast scanf("%s",&friends[*counter-1].Last_Name);
在这两种情况下,当您使用scanf作为字符串变量时,不应该放置'&amp;'在变量前面,因为字符串变量已经是字符串第一个元素的地址。
这个大佬工作:
1)在函数setFirst scanf("%s",friends[*counter-1].First_Name);
中
2)在函数setLast scanf("%s",friends[*counter-1].Last_Name);
答案 1 :(得分:0)
看起来问题是setFirst
和setLast
都在递增计数器。因此,第一个条目的第一个名称和第二个条目的姓氏被填充。
答案 2 :(得分:0)
您的错误输出是因为当您调用函数showContacts
时,它首先调用函数getFirst
,然后调用函数getLast
,当您添加名称john smith
时jane doe
函数getFirst
将打印john jane
,函数getLast
打印smith doe
要解决这个问题,你应该这样做:
void show_contact(fr * friends,int * counter,char * nullStr,int i){
for(i = 0:* counter)
if(strcmp(nullStr,friends [i] .First_Name)!= 0)
//在这里你应该调用函数 getFirst 和 getLast
}
你应该getFirst
和getLast
只打印函数i
中找到的位置showContact
的名/姓
答案 3 :(得分:0)
以下代码可以解决您的所有问题:
void show_contact(fr * friends,int * counter,char * nullStr,int i) {
for(i = 0; i&lt; * counter; i ++)
if (strcmp(nullStr, friends[i].First_Name) != 0){
getFirst(friends, i); getLast(friends, i); }
}
char getFirst(fr * friends,int pos) {
printf("%s\n", friends[pos].First_Name); return *friends[pos].First_Name;
}
char getLast(fr * friends,int pos) {
printf("%s\n", friends[pos].Last_Name); return *friends[pos].Last_Name;
}
答案 4 :(得分:0)
好的,我做了一些更改,然后我粘贴了整个代码(包括主要代码) 我摆脱了变量nullStr。当你想查看某个名字是否为balnk时,你可以使用strlen(string)来获得该字符串的大小。如果大小为0,则表示该字符串为空。
以下是代码:
#
包括&lt; stdio.h&gt; #include&lt; string.h&gt;typedef struct friends_contact {
char First_Name[10]; char Last_Name[10]; char home[15]; char cell[15];
} FR;
void menu(fr*friends ,int* counter,int user_entry,int i);
void setFirst(fr*,int *,int i);
char getFirst(fr*,int i);
void setLast(fr*friends, int* counter, int i);
char getLast(fr*friends , int i);
void add_contact(fr*friends,int* counter,int i);
void show_contact(fr*friends ,int* counter, int i);
int main() {
int user_entry=0; fr friends[5]; int counter=0; int i=0; menu(friends, &counter,user_entry,i); return 0;
}
void menu(fr * friends,int * counter,int user_entry,int i) {
做{
printf("Phone Book Application\n"); printf("1) Add friend\n2) Delete friend\n3) Show a friend\n 4) Show phonebook\n5)Exit");
scanf(“%d”,&amp; user_entry);
if(user_entry==1){ add_contact(friends,counter,i); } if(user_entry==4){ show_contact(friends, counter,i); } }while(user_entry!=5);
}
void setFirst(fr * friends,int * counter,int i) {
printf("Enter a first name \n"); scanf("%s",friends[*counter].First_Name);
}
void setLast(fr * friends,int * counter,int i) {
printf("Enter a first name \n"); scanf("%s",friends[*counter].Last_Name);
}
void add_contact(fr * friends,int * counter,int i) {
setFirst(friends,counter,i); setLast(friends,counter,i); (*counter)++;
}
void show_contact(fr * friends,int * counter,int i){
for( i = 0; i < *counter; i++)
if (strlen(friends[i].First_Name) && strlen(friends[i].Last_Name) ) {
getFirst(friends, i); getLast(friends, i); }
}
char getFirst(fr * friends,int pos){
printf("%s ", friends[pos].First_Name); return *friends[pos].First_Name;
}
char getLast(fr * friends,int pos){
printf("%s\n", friends[pos].Last_Name); return *friends[pos].Last_Name;
}