使用GCC编译教科书中提供的C代码时出错

时间:2015-09-26 05:27:30

标签: c gcc

我是CS学生即将开始我的第二年。在准备中,我正在阅读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的不同之处。谢谢大家,我真的很感激!

2 个答案:

答案 0 :(得分:3)

1。包括标题<stdio.h>(其中printffgets已定义)

2。 main() - &gt; int main(void)int main(int argc, char **argv)

3。添加return 0;(表示成功和良好做法)。

答案 1 :(得分:1)

您的代码依赖于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 */
}