2011-08-31 54 views
0

我想获取输入数据并使用结构打印它。当我运行这个代码时,它没有为姓输入。它直接要求输入名字的输入。有人可以帮我弄这个吗。谢谢。问题与获取()

address.c 

typedef struct 
{ 
    char lname[25]; 
    char fname[20]; 
    char address[20]; 
    char phonenumber[20]; 
}addressbook; 

addressbook a; 
int main() 
{ 
printf("enter details:\n"); 
    printf("enter lastname:\n"); 
    gets(a.lastname); 
    printf("enter firstname:\n"); 
    gets(a.firstname); 
    printf("enter address:\n"); 
    gets(a.address); 
    printf("enter phone number:\n"); 
    gets(a.phonenumber); 
    printf("lastname:%s\n",a.lastname); 
    printf("firstname: %s\n", a.firstname); 
    printf("address:%s\n", a.address); 
    printf("phone number:%s\n", a.phonenumber); 
} 

当我运行它时,它不会等待输入姓氏。它直接进入firstname。

+8

只是一个注意:['gets()'是危险的](http://stackoverflow.com/questions/2843073/warninggets-function-is-dangerous) –

+1

gets()已被弃用一段时间。使用getline()来代替。为了避免溢出 – CoolBeans

+3

总是使用'fgets'而不是'gets',以避免溢出 –

回答

0

该代码甚至不会编译因为它的立场,生产(在我的环境):

[email protected]:~$ gcc -Wall -Wextra -o qq qq.c 
qq.c: In function ‘main’: 
qq.c:12:2: warning: implicit declaration of function ‘printf’ 
qq.c:12:2: warning: incompatible implicit declaration of built-in function ‘printf’ 
qq.c:14:4: warning: implicit declaration of function ‘gets’ 
qq.c:14:10: error: ‘addressbook’ has no member named ‘lastname’ 
qq.c:16:10: error: ‘addressbook’ has no member named ‘firstname’ 
qq.c:21:28: error: ‘addressbook’ has no member named ‘lastname’ 
qq.c:22:31: error: ‘addressbook’ has no member named ‘firstname’ 
qq.c:25:1: warning: control reaches end of non-void function 

你应该总是(至少在初期)高警告级别编译并注意什么编译器告诉你:

  • 你应该包括stdio.h如果你打算使用printfgets
  • 您应该在结构中使用一致的字段名称。
  • 你应该从非无效函数中返回一些东西(从技术上讲,这在标准的后期版本中是不必要的,但它对于可移植性来说仍然是一个好主意)。

另外,你可能要考虑以下几点:

  • int main()不是的main函数的两个典型形式之一。虽然标准允许用于实现定义的额外1,但对于这种特定情况的“正确”1将是int main (void)
  • gets危险功能,因为没有办法防止缓冲区溢出,使您的代码不安全。例如,如果我为我的名字输入了一千个字符,它可能会在堆栈上覆盖巨大的会计信息块(例如返回地址),从而导致程序崩溃。你可以找到一个更安全的输入功能here

制作的这些变化,你最终会喜欢的东西:

#include <stdio.h> 

typedef struct { 
    char lastname[25]; 
    char firstname[20]; 
    char address[20]; 
    char phonenumber[20]; 
}addressbook; 

addressbook a; 
int main (void) { 
    printf("enter details:\n"); 

    printf("enter lastname:\n"); 
    gets(a.lastname); 

    printf("enter firstname:\n"); 
    gets(a.firstname); 

    printf("enter address:\n"); 
    gets(a.address); 

    printf("enter phone number:\n"); 
    gets(a.phonenumber); 

    printf("lastname:%s\n",a.lastname); 
    printf("firstname: %s\n", a.firstname); 
    printf("address:%s\n", a.address); 
    printf("phone number:%s\n", a.phonenumber); 

    return 0; 
} 

其中编译和运行正常,但它仍然有严重的缓冲区溢出漏洞。如果你想解决这个问题,你可以参考我给出的链接。