我是一个即将开始第二年的计算机系学生。在准备过程中,我正在阅读Mark Handley的《Java程序员的C编程入门》。
在里面我发现了这个密码,我决定自己试试:

#include <stdlib.h>
main()
{
char *s1;
char s2[80];
char *s3;
s1 = "Hello";
s3 = malloc(80);
printf("Enter your first name:\n");
fgets(s2, 80, stdin);
printf("Enter your last name:\n");
fgets(s3, 80, stdin);
printf("%s %s %s\n", s1, s2, s3);
free(s3);
}

在尝试使用GCC编译时,出现以下错误:
strings.c: In function ‘main’:
strings.c:11: warning: incompatible implicit declaration of built-in     `
`function ‘printf’
strings.c:12: error: ‘stdin’ undeclared (first use in this function)
strings.c:12: error: (Each undeclared identifier is reported only once
strings.c:12: error: for each function it appears in.)

就像我说的,这是从文本中复制的代码,所以我有点沮丧,它不起作用。我想这一定与GCC的版本有关。如果有人能帮助我朝着正确的方向去理解这里发生的事情,我将不胜感激。谢谢!
更新:根据下面的有用建议更改了代码,它可以工作。它没有在文本中明确说明要尝试这段代码,我自己承担了这一任务。我认为作者只是想展示如何在C中处理字符串,以及它与Java的区别。谢谢大家,我真的很感激!

最佳答案

您的代码依赖于printffgetsstdin的隐式声明以及main()的旧签名。它不会编译,因为它当前不是有效的C(它甚至不是有效的C89,第一个C标准)。
您需要在这些定义所在的位置包含stdio.h。GCC允许您使用main()的签名作为扩展,但它在技术上仍然不是有效的C。

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    char *s1;
    char s2[80];
    char *s3;
    s1 = "Hello";
    s3 = malloc(80);
    printf("Enter your first name:\n");
    fgets(s2, 80, stdin);
    printf("Enter your last name:\n");
    fgets(s3, 80, stdin);
    printf("%s %s %s\n", s1, s2, s3);
    free(s3);
    return 0; /* not necessary, but it's good practice */
}

10-07 19:43
查看更多