gets()的问题

我正在尝试获取输入数据并使用结构打印它。 当我运行此代码时,它没有输入lastname的输入。 它直接要求输入firstname的输入。 有人可以帮我弄这个吗。 谢谢。

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); } 

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

该代码甚至不会按原样编译 ,生成(在我的环境中):

 pax@pax-desktop:~$ 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函数的两个规范forms之一。 虽然标准允许实现定义的额外的,但对于这个特定情况,“正确”的标准将是int main (void)
  • gets是一个危险的函数,因为没有办法防止缓冲区溢出,使你的代码不安全。 例如,如果我为我的名字输入了一千个字符,它可能会通过覆盖堆栈上的大量会计信息(例如返回地址)来搞砸你的程序。 您可以在这里找到更安全的输入function。

完成大部分更改后,您最终会得到以下内容:

 #include  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; } 

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