pl_014 于 2010-08-23 06:27:57发表:
[i=s] 本帖最后由 pl_014 于 2010-8-23 06:43 编辑 [/i]呃,说完了倒是有点糊涂了,但你可以试着去编译我写出的源代码,命令是gcc -Wall <输入文件> -o <输出文件>,然后执行这个程序,你应该会发现程序所输出的结果为你所说的第二部分 我并不清楚你的意图,如果说想将这个列表运用到其它程序里,那么你可以将1-6行的内容变为头文件.h的内容,24行以后的内容单独编译,变成一个库文件,再应用到其它程序 如果要生成目标文件,则使用命令gcc -Wall -c <输入文件> -o <输出文件> 其中,readpasswd()是读取/etc/passwd,并将用户列表保存到一个二重指针所指向的一个指针数组所指向的内容,简单的说,和main(int argc,char** argv)中argv的用法几乎是一样的,最后一个指针是空指针作为结束标记
yanlong938 于 2010-08-23 00:03:55发表:
接下来做合并 paste file1 file2 > file 查看下file的内容 你会发现大体上实现了 排版有点难看。。。 [attach]31879[/attach]
yanlong938 于 2010-08-22 23:56:41发表:
第二部分 cat /etc/passwd |cut -d : -f 1 把用户列出来 echo "$(cat /etc/passwd |cut -d : -f 1)">>file2 将用户列表保存到file2上
yanlong938 于 2010-08-22 23:49:17发表:
第一部分 wc -l /etc/passwd 看它有多少用户,例有38个 for n in {1..38};do echo "the $n account is" >>file1;done
yanlong938 于 2010-08-22 23:39:56发表:
[i=s] 本帖最后由 yanlong938 于 2010-8-22 23:48 编辑 [/i]我把我的思路说下 要求列出 the n account is $user 我可以分两部分写 一部分the n account is 另一部分 $user 分别用for语句列出各自的部分 然后拼接起来
yanlong938 于 2010-08-22 23:33:08发表:
首先感谢下pl_014 但C我真不太懂
pl_014 于 2010-08-20 22:06:24发表:
[i=s] 本帖最后由 pl_014 于 2010-8-23 06:29 编辑 [/i]源代码先进行隐藏,留给你思考的余地,由于没有说明使用什么语言,所以就用C去写了,我试了没发现什么问题[code]#include #include #include char** readpasswd(); void freemem(char** userlist); int main() { int i; char** namelist; namelist=readpasswd(); if(namelist==NULL) { printf("An error occured during operation."); } for(i=0;namelist[i]!=NULL;i++) printf("%s\n",namelist[i]); freemem(namelist); return 0; } //生成数组 char** readpasswd() { int i,j=1,k; char ch; char **userlist; //由于每一个字符串的大小都是不固定的,故使用二重指针指向一个指针数组 char username[256]; //临时存储用户名 FILE *fpasswd; //打开文件 fpasswd=fopen("/etc/passwd","r"); if(fpasswd==NULL) { fclose(fpasswd); return NULL; } //读取第一行冒号前的字符串 ch=getc(fpasswd); for(i=0;ch!=':';i++) { username[i]=ch; ch=fgetc(fpasswd); } username[i]='\0'; while(ch!='\n') ch=fgetc(fpasswd); //分配空间 userlist=(char**)malloc(sizeof(char*)); if(userlist==NULL) { fclose(fpasswd); return NULL; } userlist[0]=(char*)malloc(i+1); if(userlist[0]==NULL) { free(userlist); fclose(fpasswd); return NULL; } strcpy(userlist[0],username); //将每个用户名导入到数组中 ch=fgetc(fpasswd); while(!feof(fpasswd)) { //读取用户名 for(i=0;ch!=':';i++) { username[i]=ch; ch=fgetc(fpasswd); } username[i]='\0'; while(ch!='\n') ch=fgetc(fpasswd); //分配空间 userlist=(char**)realloc(userlist,sizeof(char*)*(j+1)); if(userlist==NULL) { for(k=0;k free(userlist[k]); free(userlist); fclose(fpasswd); return NULL; } userlist[j]=(char*)malloc(i+1); if(userlist[j]==NULL) { for(k=0;k<=j;k++) free(userlist[k]); free(userlist); fclose(fpasswd); return NULL; } //保存用户名 strcpy(userlist[j],username); j++; ch=fgetc(fpasswd); } //这里用于存放结束标记 userlist=(char**)realloc(userlist,sizeof(char*)*(j+1)); if(userlist==NULL) { for(k=0;k free(userlist[k]); free(userlist); fclose(fpasswd); return NULL; } userlist[j]=NULL; fclose(fpasswd); return userlist; } //释放内存 void freemem(char** userlist) { int i; for(i=0;userlist[i]!=NULL;i++) free(userlist[i]); free(userlist[i]); free(userlist); }[/code]
pl_014 于 2010-08-20 22:02:54发表:
先说一下解决的思路吧 首先要分析/etc/passwd这个文件, 在终端输入命令$ls -l /etc/passwd,可以得到权限是rw-r--r-- 然后输入命令$cat /etc/passwd,会发现,该文件的每一行是一个用户的信息,并且没有其它额外的内容,根据用户信息的格式username:password:uid:gid:userinfo:home:shell,可知,我们需要的只是每一行的第一个冒号前的内容 本人先打算使用fscanf函数来实现,但发现行不通,所以只好自己写代码了。 解决这个问题需要文件、指针、数组相关的知识,其中把相关功能写成了独立函数。 由于每个用户名和用户名的数量都是不固定的,所以,可以模仿argv来构造一个指针数组,每个指针都指向一个字符串。也可以建立链表,每个链表存储指向一个字符串的指针。我采用第一种方法
pl_014 于 2010-08-23 06:27:57发表:
[i=s] 本帖最后由 pl_014 于 2010-8-23 06:43 编辑 [/i]
呃,说完了倒是有点糊涂了,但你可以试着去编译我写出的源代码,命令是gcc -Wall <输入文件> -o <输出文件>,然后执行这个程序,你应该会发现程序所输出的结果为你所说的第二部分
我并不清楚你的意图,如果说想将这个列表运用到其它程序里,那么你可以将1-6行的内容变为头文件.h的内容,24行以后的内容单独编译,变成一个库文件,再应用到其它程序
如果要生成目标文件,则使用命令gcc -Wall -c <输入文件> -o <输出文件>
其中,readpasswd()是读取/etc/passwd,并将用户列表保存到一个二重指针所指向的一个指针数组所指向的内容,简单的说,和main(int argc,char** argv)中argv的用法几乎是一样的,最后一个指针是空指针作为结束标记
yanlong938 于 2010-08-23 00:03:55发表:
接下来做合并
paste file1 file2 > file
查看下file的内容 你会发现大体上实现了
排版有点难看。。。
[attach]31879[/attach]
yanlong938 于 2010-08-22 23:56:41发表:
第二部分
cat /etc/passwd |cut -d : -f 1 把用户列出来
echo "$(cat /etc/passwd |cut -d : -f 1)">>file2 将用户列表保存到file2上
yanlong938 于 2010-08-22 23:49:17发表:
第一部分
wc -l /etc/passwd 看它有多少用户,例有38个
for n in {1..38};do echo "the $n account is" >>file1;done
yanlong938 于 2010-08-22 23:39:56发表:
[i=s] 本帖最后由 yanlong938 于 2010-8-22 23:48 编辑 [/i]
我把我的思路说下
要求列出 the n account is $user
我可以分两部分写
一部分the n account is
另一部分 $user
分别用for语句列出各自的部分 然后拼接起来
yanlong938 于 2010-08-22 23:33:08发表:
首先感谢下pl_014
但C我真不太懂
pl_014 于 2010-08-20 22:06:24发表:
[i=s] 本帖最后由 pl_014 于 2010-8-23 06:29 编辑 [/i]
free(userlist[k]);
free(userlist[k]);
源代码先进行隐藏,留给你思考的余地,由于没有说明使用什么语言,所以就用C去写了,我试了没发现什么问题[code]#include
#include
#include
char** readpasswd();
void freemem(char** userlist);
int main()
{
int i;
char** namelist;
namelist=readpasswd();
if(namelist==NULL)
{
printf("An error occured during operation.");
}
for(i=0;namelist[i]!=NULL;i++)
printf("%s\n",namelist[i]);
freemem(namelist);
return 0;
}
//生成数组
char** readpasswd()
{
int i,j=1,k;
char ch;
char **userlist; //由于每一个字符串的大小都是不固定的,故使用二重指针指向一个指针数组
char username[256]; //临时存储用户名
FILE *fpasswd;
//打开文件
fpasswd=fopen("/etc/passwd","r");
if(fpasswd==NULL)
{
fclose(fpasswd);
return NULL;
}
//读取第一行冒号前的字符串
ch=getc(fpasswd);
for(i=0;ch!=':';i++)
{
username[i]=ch;
ch=fgetc(fpasswd);
}
username[i]='\0';
while(ch!='\n')
ch=fgetc(fpasswd);
//分配空间
userlist=(char**)malloc(sizeof(char*));
if(userlist==NULL)
{
fclose(fpasswd);
return NULL;
}
userlist[0]=(char*)malloc(i+1);
if(userlist[0]==NULL)
{
free(userlist);
fclose(fpasswd);
return NULL;
}
strcpy(userlist[0],username);
//将每个用户名导入到数组中
ch=fgetc(fpasswd);
while(!feof(fpasswd))
{
//读取用户名
for(i=0;ch!=':';i++)
{
username[i]=ch;
ch=fgetc(fpasswd);
}
username[i]='\0';
while(ch!='\n')
ch=fgetc(fpasswd);
//分配空间
userlist=(char**)realloc(userlist,sizeof(char*)*(j+1));
if(userlist==NULL)
{
for(k=0;k
free(userlist);
fclose(fpasswd);
return NULL;
}
userlist[j]=(char*)malloc(i+1);
if(userlist[j]==NULL)
{
for(k=0;k<=j;k++)
free(userlist[k]);
free(userlist);
fclose(fpasswd);
return NULL;
}
//保存用户名
strcpy(userlist[j],username);
j++;
ch=fgetc(fpasswd);
}
//这里用于存放结束标记
userlist=(char**)realloc(userlist,sizeof(char*)*(j+1));
if(userlist==NULL)
{
for(k=0;k
free(userlist);
fclose(fpasswd);
return NULL;
}
userlist[j]=NULL;
fclose(fpasswd);
return userlist;
}
//释放内存
void freemem(char** userlist)
{
int i;
for(i=0;userlist[i]!=NULL;i++)
free(userlist[i]);
free(userlist[i]);
free(userlist);
}[/code]
pl_014 于 2010-08-20 22:02:54发表:
先说一下解决的思路吧
首先要分析/etc/passwd这个文件,
在终端输入命令$ls -l /etc/passwd,可以得到权限是rw-r--r--
然后输入命令$cat /etc/passwd,会发现,该文件的每一行是一个用户的信息,并且没有其它额外的内容,根据用户信息的格式username:password:uid:gid:userinfo:home:shell,可知,我们需要的只是每一行的第一个冒号前的内容
本人先打算使用fscanf函数来实现,但发现行不通,所以只好自己写代码了。
解决这个问题需要文件、指针、数组相关的知识,其中把相关功能写成了独立函数。
由于每个用户名和用户名的数量都是不固定的,所以,可以模仿argv来构造一个指针数组,每个指针都指向一个字符串。也可以建立链表,每个链表存储指向一个字符串的指针。我采用第一种方法