在C中的初学者电话簿应用程序中的奇怪输出

时间:2012-11-02 18:59:50

标签: c function pointers

我是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

当我在列表中添加其他名称时,我的结果同样奇怪。奇怪的是我在创建姓氏函数后才开始遇到这些问题。当我输入名字时它工作得很好。有什么想法吗?

5 个答案:

答案 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)

看起来问题是setFirstsetLast都在递增计数器。因此,第一个条目的第一个名称和第二个条目的姓氏被填充。

答案 2 :(得分:0)

您的错误输出是因为当您调用函数showContacts时,它首先调用函数getFirst,然后调用函数getLast,当您添加名称john smithjane 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

                 
          

}

        
      
    
  

你应该getFirstgetLast只打印函数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;
         

}