标题: 帮忙看一下这个程序。运行时总显示“段错误”
ladan
新生入学
Rank: 1



UID 220821
精华 0
积分 10(积分有什么用?)
帖子 3
阅读权限 10
注册 2008-1-1
状态 离线
发表于 2008-1-3 17:28  资料  个人空间  短消息  加为好友 
帮忙看一下这个程序。运行时总显示“段错误”

程序作用:在 Linux 下,编写 Shell 程序,计算磁盘上所有目录下平均文件个数、所有目录平均cZ
sx%@8Uw

深度、所有文件名平均长度7s| fCr8^|H
源程序:
Yq2?w)gYDs#include <sys/stat.h>8Qw
v7Hx%V$o

#include <sys/types.h>*y0Z#o#Ni{]-D
#include <string.h>
0|(f6o}[Xw-b#include <stdio.h>
&Ku-R@(uS_ ~#include <stdlib.h>

W:rI r)mbZLinux伊甸园论坛
#include <dirent.h>-}u&B#Qw9A
int func(char*path,int* AllFileNumber,int* AllDepthNumber,
6b4f @Z^"Vev                       int* AllFilenameNumber,int* AllFoldNumber)Linux伊甸园论坛l.T8J$O:W
Nl#F

{
)t)X.PU!W        y  struct stat statbuf;www.linuxeden.com(_+}5@Is
  struct dirent *dirp;Linux伊甸园论坛%y]"C["A6`
  DIR *dp;9}eNnj$@D
  char *str1;www.linuxeden.como%T
{8@v%Q:l
z

  char *str2;

a \5jnc:zNwww.linuxeden.com
  int judge1;L1rMn9IGVu
]f

  int judge2;
%CTP7t:{gi5f  int ret;
R_.Y9SL@$cwww.linuxeden.com  judge1=0;
(U9F8Q(G%Sfwww.linuxeden.com  judge2=0;W~*Z*eJrA
                                 
!S.i?.xR3jLinux伊甸园论坛  stat(path,&statbuf);

I6F        C Rb!T
l1Z

)N&rNo4bU!uswitch(statbuf.st_mode&S_IFMT)
p TV7Yl;}O{
%P*^(h;{5J.KD"[Linux伊甸园论坛case S_IFREG:                             
|7p[yh[Linux伊甸园论坛                     *AllFilenameNumber=strlen(path)+1;www.linuxeden.com,Tk%E;xAS#X*i(@-[
                     *AllFileNumber=*AllFileNumber+1;E6Mr/hul Ur+iK
                     *AllDepthNumber=*AllDepthNumber+1;
i3LC:|
??G1qC
                     break;
!az
]n8@%Gq)^3iLinux伊甸园论坛
case S_IFDIR:     *AllDepthNumber=*AllDepthNumber+1;www.linuxeden.com-^.ts.}        W e^ m4S9@
                  *AllFoldNumber=*AllFoldNumber+1;www.linuxeden.com$avDb g$j#s~
                  dp=opendir(path);

p Pe'XuY
                  while((dirp=readdir(dp))!=NULL)
6PX;[4U$X do]2u                                               {
        ~$n:q;i ?:w                  if((strcmp(dirp->d_name,".")==0)||(strcmp(dirp->d_name,"..")==0))Linux伊甸园论坛g`"h2SMM)F)gO
                                                   
:vRl        kmz*r'~:^4u                       if(judge1==0){
F!WO sf$T4dLinux伊甸园论坛                                             
oD m*IW){                       strcpy(str1,path);
!c,bjV6|Pa!b\bLinux伊甸园论坛                       judge1=1;}
w_~!{acJ MLinux伊甸园论坛                       if (judge2==0)www.linuxeden.comB Zl0a
X C~

                                                            {www.linuxeden.com
VL7S7eppR2\'v

                       str2=str1+strlen(str1);www.linuxeden.com"V8`E;k`:Z{*S.y
                       judge2=1;
Ji3]"bh/hDLinux伊甸园论坛                                                            }Linux伊甸园论坛s-B._,F H%}
                                               
0kqd
a7J{
g"R
                       *str2++='/';Linux伊甸园论坛[#}7O@Y6] oID+o
                       *str2=0;
8M`N6I{T:P                    strcpy(str2,dirp->d_name); www.linuxeden.comTzsMhN3g"m;id
                    ret=func(str1, AllFileNumber,AllDepthNumber,
L4dL        oo
?yi
                                     AllFilenameNumber,AllFoldNumber);www.linuxeden.com%Od~K6}~_%^%Q
                    *str2--;Linux伊甸园论坛-EKF1bO1i&d
                    *str2=0;Wp%}zj
qs
];^(Ae

                                                     }Linux伊甸园论坛;?+f/[-gwp$~]n
                    closedir(dp);               
,tON&Z \^#B                    break;
rTQiv|&jE8t&xdefault:        break;p)q3u)V'S&E        PL
}f;y7mKB^F:`
   return 0;
H5kh$v:[#sq5VK9g}M/F\{g(J L
int main(int argc,char *argv[])
'k#dd y!k1Qd
Y8T.](N
{

Xx
Y
K}Qg
QLinux伊甸园论坛
    int ret;HgX.d%Uur
    int AllFileNumber=0;
(k6D(ZP Pp    int AllDepthNumber=0;
u4eR~$I mD        c    int AllFilenameNumber=0;www.linuxeden.comm4y#P$f;fl-H
    int AllFoldNumber=0;
)u| RQ8g x    ret=func(argv[1],&AllFileNumber,&AllDepthNumber,&AllFilenameNumber,pJ6@0`W2Pp
             &AllFoldNumber);]T        p7?7ln~
    printf("The average filenumber is %d\n",AllFileNumber/AllFoldNumber);
%R']Jyn%W;{/R
^
    printf("The average fileDepthnumber is %d\n",
|&E[ZxxZwww.linuxeden.com            AllDepthNumber/AllFoldNumber);/~(M%A wd+|O4b
    printf("The average filenameNumber is %d\n",
[6hsu&C*N5[,e              AllFilenameNumber/AllFileNumber);
7Vb(K @w![ B#XC/F    return 0;_bIK'H
}

顶部
不容错过的IBM 集群技术资源汇总
ladan
新生入学
Rank: 1



UID 220821
精华 0
积分 10(积分有什么用?)
帖子 3
阅读权限 10
注册 2008-1-1
状态 离线
发表于 2008-1-4 17:59  资料  个人空间  短消息  加为好友 
没有人帮忙看一下吗?

顶部
不容错过的IBM 集群技术资源汇总
ladan
新生入学
Rank: 1



UID 220821
精华 0
积分 10(积分有什么用?)
帖子 3
阅读权限 10
注册 2008-1-1
状态 离线
发表于 2008-1-5 12:39  资料  个人空间  短消息  加为好友 
回复 #1 ladan 的帖子

经过努力最终解决了这个问题。 现把改完的源程序贴上来 +\#W8h,yb"VXh
#include <sys/stat.h>
$t&M.E2EJ;cwww.linuxeden.com#include <sys/types.h>
Qae
e:E5ouT
#include <string.h>
#e{1},C`gG        j*ND?Linux伊甸园论坛#include <stdio.h>
@FOn9L#t7pYx#include <stdlib.h>
f~-XJ(Z#vO&LLinux伊甸园论坛#include <dirent.h>/^yM:o"H:uA:e,H
#include<unistd.h>
/d-pWJoOxGvoid func(const char* pathname,int* AllFileNumber,int* AllDepthNumber,int* AllFilenameNumber,int* AllFoldNumber)Linux伊甸园论坛PLT{r%[&E
{&Fg%\y#uh2H
  
FRx^jlN(s[  struct stat statbuf;
;]4?$zD caL~b  struct dirent *dirp;
'aPNBBZ&p  DIR *dp;www.linuxeden.comY!I#yXa
  char str1[100];
3x5p K;lwLinux伊甸园论坛  char str2[100];Linux伊甸园论坛qZu6A;v,DK8m"r*@i
  int judge1;} SS,B2W`0cEJ%M
  int judge2;Linux伊甸园论坛;r U lT ~
  int m;Linux伊甸园论坛'{Q6GdTH9j
  judge1=0;
,k,J!]WQ,g$sLinux伊甸园论坛  judge2=0;Linux伊甸园论坛MFAYPI
@4|x

  stat(pathname,&statbuf);
:Oe,x oQ+Ywww.linuxeden.com  printf("%s",pathname);
Z%UGQ2y]2u                                    //将路径结点的信息放到 statbuf 结构体中Linux伊甸园论坛3_HM@g/Z
  printf("%d",statbuf.st_mode);
yA+nx2{&R"N     //检查节点文件的类型
*Z0V$Iknswitch(statbuf.st_mode&S_IFMT)Linux伊甸园论坛z0E!K!m"@CL)W
{
_U?sy:x6TG        ?)H3K^case S_IFREG:                              //当为普通文件时
Z iX&n6Ygwww.linuxeden.com                     *AllFilenameNumber=strlen(pathname)+1;
M:Vf-A"Z2QK(y                     *AllFileNumber=*AllFileNumber+1;
-t6~\'gPmQ.y                     *AllDepthNumber=*AllDepthNumber+1;
'h
L F7I1U v$_7R7Jwww.linuxeden.com
                     printf("%d\n%d\n%d\n",*AllFilenameNumber,*AllFileNumber,*AllDepthNumber);O|\u!]g
                     break;AV+x2]-rF W*G
case S_IFDIR:     *AllDepthNumber=*AllDepthNumber+1; //当为目录文件时,打开目录
jxpE$wBh,Vrwww.linuxeden.com                  *AllFoldNumber=*AllFoldNumber+1;*wI9B1g$Y#X
                  dp=opendir(pathname);Pl~*h)o        @$|0P'x
                  while((dirp=readdir(dp))!=NULL)F\e'^K
                                               {
O!|C*vD"r                                                         www.linuxeden.com2_0n7F*O;Ze[
                  if((strcmp(dirp->d_name,".")==0)||(strcmp(dirp->d_name,"..")==0))^H\f;VC
Pi.n

                                            -`_N.Hl]!|N8e
                       continue;
0lG+Kk0ctN                            if(judge1==0){www.linuxeden.com@#YBsa]0{
                                               //复制路径到字符串 str1 上Linux伊甸园论坛.hS$h4}\
MXQ

                       strcpy(str1,pathname);Linux伊甸园论坛!WY3xCz)n%y R.T r R
                       judge1=1;}
.V4Kl jy
G'g"`5vGw
                       if (judge2==0)
!\){0^to"p@u-]Linux伊甸园论坛                                                            {
Ynp        K7Li                       //str2=str1+strlen(str1);www.linuxeden.com
CF"tzL,r+U

                       strcpy(str2,str1);L/{pF3e"Q:E
                                                              
7C2]2W&Qzt        O8o                       judge2=1;/n4BJ3Qzfzu
                                                            }
~@WTV;w                                                  //在 str2 的后面加上’/’
)s5nA3Zs3\                       m=strlen(str2); u%f-N/@;k.P
                       str2[m]='/';Z2p
l3o#F$X!IH

                       str2[m+1]='\0';
7s
sm5D
m$\Sz3Bwww.linuxeden.com
                    strcpy(str2,dirp->d_name); //在 str2 的后面加上某个文件名Linux伊甸园论坛4r7~VeL-Q$W*^)R wf
                                      
)L r8{n m*Q,KA7p                    func(str2,AllFileNumber,AllDepthNumber,v9P,p\;he7tO7vz
                                    AllFilenameNumber,AllFoldNumber);
:^X4H        aR}www.linuxeden.com                      str2[m]='\0';
?&s;fsB                                                     }                                                
5Pt8P8B;x"ULinux伊甸园论坛                    closedir(dp);
s u,F1z(H4zH
{!T
n
                                                               //关闭目录8b%St:].^`:Q,j
                    break;
o5kG2Rb3y
k9b
o
default:        break;u)H ?F$b{-f"F
}
R7~G6@5@'V}G{#xwww.linuxeden.com6iaWa2Hj
}
m:\4P,Ng_-Zq/JJDeE;J?3^+oY/je
int main(int argc,char *argv[])
'Az+tz/T{
W$Hl`na(q        CSp

   
fLRY
\2}#Xg
    int AllFileNumber=0;
(\&x5[ C [5q    int AllDepthNumber=0;1_}5Ylt6q[%{!V
    int AllFilenameNumber=0;\F9e3r wZ?!T
    int AllFoldNumber=0;
}'w&ih]|'_{ Zwww.linuxeden.comf/e4ZK*VI4E*E
    func(argv[1],&AllFileNumber,&AllDepthNumber,&AllFilenameNumber,:ev/Zh6Gn5wApP,F
            &AllFoldNumber);www.linuxeden.comNK,^+J6ym
    printf("The average filenumber is %d\n",AllFileNumber+AllFoldNumber);
H9D g/h?"jLinux伊甸园论坛    printf("The average fileDepthnumber is %d\n",
8HP)?\x"]
~RvaOwww.linuxeden.com
            AllDepthNumber+AllFoldNumber);sUUwp%Ai
    printf("The average filenameNumber is %d\n",www.linuxeden.com"x3i6P)\[aV[3?6l
              AllFilenameNumber+AllFileNumber);
q+a7wAb(qk        z    return 0;0M$w7L*J7J0r'pD
}

顶部
不容错过的IBM 集群技术资源汇总
 



当前时区 GMT+8, 现在时间是 2008-5-17 03:11

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.081931 second(s), 5 queries

清除 Cookies - 联系我们 - Linux伊甸园 - Archiver - WAP