我目前正在课堂上学习Linux终端命令的C实现,但我似乎无法在我的机器上运行以下示例。我正在使用最新的Ubuntu发行版。它会编译但有警告。 "赋值使得整数指针不带强制转换"它指的是a = ctime(& n-> ut_time)的行;我在网上找到了这个代码。假设复制终端命令" Who"显示系统用户。我只是试图研究它是如何工作的,但我似乎无法让它运行起来。任何帮助或解释将不胜感激。
#include<stdio.h>
#include<sys/utsname.h>
#include<utmp.h>
int main(void)
{
struct utmp *n;
char *a;
int i;
setutent();
n=getutent();
while(n!=NULL)
{
if(n->ut_type==7)
{
printf("%-9s",n->ut_user);
printf("%-12s",n->ut_line);
a=ctime(&n->ut_time);
printf(" ");
for(i=4;i<16;i++)
{
printf("%c",a[i]);
}
printf(" (");
printf("%s",n->ut_host);
printf(")\n");
}
n=getutent();
}
}
答案 0 :(得分:2)
转移评论以回答
编译器告诉你,你没有#include <time.h>
因此假定ctime()
返回int
而不是char *
。所有的地狱都会破裂(分段错误等),因为你没有注意编译器的警告。
请记住,在您学习C的同时,编译器对C的了解远远超过您。应该注意它的警告。 (当你比较熟悉C时,你仍然会注意编译器警告 - 并使代码编译干净而没有警告。我使用gcc -Wall -Wextra -Werror
和一些额外的选项 - 通常-Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Wold-style-declaration
;有时候{{1} },-Wshadow
;偶尔还有其他一些。)