2013-07-15 44 views
1
#include <stdio.h> 
#include <string.h> 

struct Directory { 
    char Name; 
    long int Number; 
    int HouseNumber; 
    char street; 
}; 

int main(void) 
{ 
    struct Directory contact; 
    struct Directory *answer1, *answer2, *answer3, *answer4; 
    char answer; 

    printf("Welcome to Telephone Directory.\n\nPlease enter the name of the contact.\n"); 
    scanf("%s", &contact.Name); 

    printf("Please enter the number of the contact.\n"); 
    scanf("%ld", &contact.Number); 

    printf("Please enter the address of the contact.\n"); 
    scanf("%d %s", &contact.HouseNumber, &contact.street); 

    answer1 = &contact; 
    answer2 = &contact; 
    answer3 = &contact; 
    answer4 = &contact; 

    printf("Would you like to obtain information on your contact? Enter 'yes' or 'no'.\n"); 
    scanf("%s", &answer); 


    if (strcmp(&answer, "yes")==0) { 
     printf("%s\n", &answer1->Name); 
     printf("%ld\n", answer2->Number); 
     printf("%d", answer3->HouseNumber); 
     printf("%s", &answer4->street); 
    } 

    if (strcmp(&answer, "no")==0) { 
     printf("Thank you for using Telephone Directory.\n"); 
    } 

} 

我试图在C中创建联系人程序。我想让程序打印用户的房屋地址。我在结构中有“HouseNumber”变量,在结构中有“street”变量,将“answer3”设置为int变量,以显示“HouseNumber”和“answer4”作为显示“street”的char变量。我一起希望他们能够用一个字符串打印用户的地址,但是当我运行程序并输入“yes”以在进入门牌号和街道后显示联系信息时,程序崩溃,并显示lldb坏线程错误。似乎一切都是正确的,因为我的编译器说代码没有问题,但它崩溃了。有人可以帮助我吗?显示c中的结构的数字和字符串

+2

您的名字必须是长于1个字符。将你的“字符串”设置为char *,或使用字符串库。然后在每个结构中,必须为你的字符串指定malloc大小,并使用结构中的指针指向这个分配的内存。 – Magn3s1um

+0

你的结构是错误的。它包含名称和街道的字符而不是字符串。您应该将其设置为字符数组(即char Name [256])或将其设置为char *指针,然后在分配时使用malloc。 – John

回答

1

我在你的代码已经观察到的错误是,你已经创建了名称,街道和回答变量为char,但试图通过使用%S将导致崩溃存储在其中的字符串。在那些地方,你必须使用char *或字符数组。

char *name //(or) char name[15] 

修改后的代码看起来像这样

 #include <stdio.h> 
     struct Directory { 
     char Name[20]; 
     long int Number; 
     int HouseNumber; 
     char street[20]; 
     }; 


    int main(int argc, char *argv[]) 
    { 
     struct Directory contact; 

     struct Directory *answer1, *answer2, *answer3, *answer4; 

     char answer[4]; 

     printf("Welcome to Telephone Directory.\n\nPlease enter the name of the           contact.\n"); 

     scanf("%s", contact.Name); 

     printf("Please enter the number of the contact.\n"); 

     scanf("%ld", &contact.Number); 

     printf("Please enter the address and street of the contact.\n"); 

     scanf("%d %s", &contact.HouseNumber, contact.street); 

     answer1 = &contact; 

     answer2 = &contact; 

     answer3 = &contact; 

     answer4 = &contact; 

     printf("Enter yes r no"); 

     scanf("%s",answer); 

     if (strcmp(answer,"yes")==0) { 

     printf("%s\n", answer1->Name); 

     printf("%ld\n", answer2->Number); 

     printf("%d\n", answer3->HouseNumber); 

     printf("%s", answer4->street); 

    } 


    else { 

     printf("Thank you for using Telephone Directory.\n"); 
    } 

    return 0; 
    } 
+0

感谢mahesh。它现在有效。 – Nisarg

+0

欢迎您.... :) – Mahesh

+0

好吧,我接受了它 – Nisarg

0
struct Directory { 
    char * Name; 
    long int Number; 
    int HouseNumber; 
    char * street; 
}; 

内主:

struct Directory Contact; 
Contact.Name = malloc(sizeof(char * sizeOfName)); 

scanf("%s", contact.Name); 

然后你就可以在您的姓名/街道等复制
由于名称是一个char *,你不会用的地址,但你只将指针传递给scanf。这将用用户输入的字符串填充malloc的内存。

2

当你scanf("%s", &answer);

你写了用户的输入到char answer;到scanf函数的参数需要有足够的空间来容纳整个字符串外加一个空字节。尝试是这样的:

char answer[256]; 

这假定输入绝不会超过256个字符,但在这样一个简单的程序似乎是合理的。请注意,gcc支持非标准的%a,如果您传入char*,它将为您分配一个字符串。

当你尝试存储字符串时,你需要确保有足够的空间存放你要放入的数据,比如在字典中只保存一个字符,否则你会溢出并踩到一些其他的内存上稍后需要。

+0

谢谢!它现在完美运作。 – Nisarg

+0

谢谢大家帮助我。 – Nisarg