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



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

程序作用:在 Linux 下,编写 Shell 程序,计算磁盘上所有目录下平均文件个数、所有目录平均,?1in`f R![
深度、所有文件名平均长度
h fSr
k#^
源程序:
D `)w2t"w!u V9HWwww.linuxeden.com#include <sys/stat.h>
5W2eG}9x9Eg*N#include <sys/types.h>
qP8Ek?b iLinux伊甸园论坛#include <string.h>
P7^6E;Wkw#MLinux伊甸园论坛#include <stdio.h>T.Tpuu l
#include <stdlib.h>
n vaz%]
`)i
Qwww.linuxeden.com
#include <dirent.h>
s2~ f~3b
ip
int func(char*path,int* AllFileNumber,int* AllDepthNumber,
,]4x1jbQ5}4}:~{                       int* AllFilenameNumber,int* AllFoldNumber)
7E,~;Fw1i9u:lwww.linuxeden.com{www.linuxeden.comIvA]$Cl5M
  struct stat statbuf;*sNr_
dv9Gz

  struct dirent *dirp;
!j0` Z^ on*@  DIR *dp;
|$NJ+?"^h  char *str1;(z],bLt~
  char *str2;bA'~/p;}x6r3C
  int judge1; t8Zf        P]i8@LW
  int judge2;
"[[(i-E/eLinux伊甸园论坛  int ret;Linux伊甸园论坛EN)Oo'FJlc K/^
  judge1=0;
ySVteb)xk"ILinux伊甸园论坛  judge2=0;n5g!Ag(R2|0?H!e0{5U
                                  ~h
nX(h J2`"I\

  stat(path,&statbuf);Y(w+`r'Y9C"^.{


pD S~"p+g![I
switch(statbuf.st_mode&S_IFMT)
a4c^}Q%]2R%f&Kwww.linuxeden.com{
X7r} P#jLinux伊甸园论坛case S_IFREG:                              Qj.MbJT
f

                     *AllFilenameNumber=strlen(path)+1;Linux伊甸园论坛x:C+bCcq
                     *AllFileNumber=*AllFileNumber+1;l.b/zE,W1u%ds
                     *AllDepthNumber=*AllDepthNumber+1;
!g4r3q,z4]c W6ra                     break;
'sF9C~+U1d&H-W        h%ILinux伊甸园论坛case S_IFDIR:     *AllDepthNumber=*AllDepthNumber+1;
0dsN$b0@?rC                  *AllFoldNumber=*AllFoldNumber+1;
4@$r!Cy$r&H$WU*sh                  dp=opendir(path);;l[,J        \+EL)@bR%[
                  while((dirp=readdir(dp))!=NULL)
M'y
v ` ^I.P
                                               {
2DDM-b/n,q }
r
                  if((strcmp(dirp->d_name,".")==0)||(strcmp(dirp->d_name,"..")==0))www.linuxeden.com#w4Wwk
z7Lc%W

                                                    b^sKG9q7vX_
                       if(judge1==0){www.linuxeden.com.n+t}O8Vm
                                             
!p,h7Gd-t/sdf\                       strcpy(str1,path);+_%m
b
p1IDw

                       judge1=1;}www.linuxeden.com+~kcC(B-X9bHwr
                       if (judge2==0)G:Qmqv[_*NJ
                                                            {
^gsl)y#e                       str2=str1+strlen(str1);www.linuxeden.com~;m/C`6A+`g
                       judge2=1;
N x        V,tcNIXN
e
                                                            }
$xnP4f!k5w0Rzdb B                                               n}+p Y0n7uUY
                       *str2++='/';
9r%^W"eUfIE                       *str2=0;
-S]g:[!J        G(XK4kJLinux伊甸园论坛                    strcpy(str2,dirp->d_name); In4T*XB*{
                    ret=func(str1, AllFileNumber,AllDepthNumber,e&n7^Z(UE/i
y

                                     AllFilenameNumber,AllFoldNumber);
BE8b6U"rQ(Y~ {                    *str2--;e%j6mpn|`
                    *str2=0;
.l.[9E[+z/S(@Linux伊甸园论坛                                                     }
H
~2|!Rk9R/{        B
                    closedir(dp);               )|_;\F$\
                    break;
)jL D5~2Sa'Cdefault:        break;
$z8FH'zOt&T M+R}Linux伊甸园论坛]y`zBZ
   return 0;OAN$y_([~
}
N1n&X
AP2r
xj'H-?N]Linux伊甸园论坛
int main(int argc,char *argv[])
3e,c
R G'wA}Linux伊甸园论坛
{
v        u!P1UTs'z
v&r]+\gLinux伊甸园论坛
    int ret;
+w$sA!?_jF    int AllFileNumber=0;www.linuxeden.com
h*HU.Q&e9u

    int AllDepthNumber=0;
y
w,LXLu
vSh,N

    int AllFilenameNumber=0;Linux伊甸园论坛(r8ez8F
~0P8lRH:y

    int AllFoldNumber=0;
fy8Wl#n7u
w

    ret=func(argv[1],&AllFileNumber,&AllDepthNumber,&AllFilenameNumber,;x
Rj:^&z+]"V2t0^ Zw

             &AllFoldNumber);;Ut
Z
I;z5V#A8NK]xq

    printf("The average filenumber is %d\n",AllFileNumber/AllFoldNumber);www.linuxeden.com r/p0p
@6Wl_&z        x

    printf("The average fileDepthnumber is %d\n",K-`q_7g0s
            AllDepthNumber/AllFoldNumber);-oV;W'FJ{Pf"@7XM
    printf("The average filenameNumber is %d\n",
4K        d        lNU7XC
XT        ne
              AllFilenameNumber/AllFileNumber);
/|fD5`,t    return 0;
%{^0Rc+R}

顶部
ladan
新生入学
Rank: 1



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

顶部
ladan
新生入学
Rank: 1



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

经过努力最终解决了这个问题。 现把改完的源程序贴上来
tu])t"T3g7^`x#include <sys/stat.h>,_+_b-d0@3M
#include <sys/types.h>
_2~f!uB{VN#include <string.h>
5Fsw Xw#include <stdio.h>www.linuxeden.com)r{,R:s9Z-Qn$j)re
#include <stdlib.h>
2Ij0C{e
tTn
#include <dirent.h>wI'V!iN_
#include<unistd.h>
r9tA/mCG[void func(const char* pathname,int* AllFileNumber,int* AllDepthNumber,int* AllFilenameNumber,int* AllFoldNumber)
T*}3`!{ C3A]{www.linuxeden.comz{.P}Q
  
S['V4Y;p1H6tLinux伊甸园论坛  struct stat statbuf;
~t(p        i Rx%ZYt6J  struct dirent *dirp;www.linuxeden.com#T8x@1S2v*Xg+~
  DIR *dp;www.linuxeden.comYI\#^fGQ/|
  char str1[100];
*z}.@/~Wd+L3v  char str2[100];w"\*f'Vo3oLc
  int judge1;
Yx*]M4wV*}!v  int judge2;
aC9O!E u8r-wwww.linuxeden.com  int m;
(V R_d&w#PIM
N)s
  judge1=0;5?O8lbyq~%{
  judge2=0;FC"s F1~F8i
  stat(pathname,&statbuf);.w#j6JH        U0zS
  printf("%s",pathname);r:{3?LC
                                    //将路径结点的信息放到 statbuf 结构体中-oL#K%o{
  printf("%d",statbuf.st_mode);
4Q.xt^ ^$\     //检查节点文件的类型
enX&]!|switch(statbuf.st_mode&S_IFMT)
qUo"?        Z$}{$y#j9ay:G!E
case S_IFREG:                              //当为普通文件时

b!k#j sfn7~"]YwFy        N TLinux伊甸园论坛
                     *AllFilenameNumber=strlen(pathname)+1;
7|,Y?1s#[[0|                     *AllFileNumber=*AllFileNumber+1;
7ND4UL'tz                     *AllDepthNumber=*AllDepthNumber+1;
Kp
W
LyuFZ
                     printf("%d\n%d\n%d\n",*AllFilenameNumber,*AllFileNumber,*AllDepthNumber);
0m/d*rgJ%r(sLinux伊甸园论坛                     break;A4o8v-T r;X-`M
case S_IFDIR:     *AllDepthNumber=*AllDepthNumber+1; //当为目录文件时,打开目录
~8['V bWw
l)K\;y
                  *AllFoldNumber=*AllFoldNumber+1;.X@/A'K5gMH
                  dp=opendir(pathname);www.linuxeden.com6j#`.|*ftjjF
                  while((dirp=readdir(dp))!=NULL)Linux伊甸园论坛aA X        ?#i)k;YR(hZH
                                               {*ZJr'La?/m~
                                                         
*Ynw l5@!j                  if((strcmp(dirp->d_name,".")==0)||(strcmp(dirp->d_name,"..")==0))ww*?i0B0~?NI-k
                                            
pk QMW!S                       continue;www.linuxeden.com)T'V,tKY:]8m
                            if(judge1==0){Z4?.D1Y2g4H.l
                                               //复制路径到字符串 str1 上
y/])Vo6x$Vph's~7EE                       strcpy(str1,pathname);j;U2Q$hOO["GHM
                       judge1=1;}
$z(BO6@`www.linuxeden.com                       if (judge2==0)
w-A G{
B-O5J
                                                            {
:ZD@F
\ M4n
                       //str2=str1+strlen(str1);,kN)SMbvXm
                       strcpy(str2,str1);
m!wIM3mv(Ll                                                              Linux伊甸园论坛/O
x*Q2O0OMb,D

                       judge2=1;8^*V/[ [YLk        G
                                                            }

Bt        [ME
                                                  //在 str2 的后面加上’/’V,J~
T#A\/g d

                       m=strlen(str2);
q u7KC%jQwww.linuxeden.com                       str2[m]='/';
2Ua9^KP Du4u(YLinux伊甸园论坛                       str2[m+1]='\0';:b
e3Oa)w.nS

                    strcpy(str2,dirp->d_name); //在 str2 的后面加上某个文件名Linux伊甸园论坛NZn9NBW'gN
                                      
/\Y3`Bs^q,gLinux伊甸园论坛                    func(str2,AllFileNumber,AllDepthNumber,3^"D+P&|7D7t
b.G

                                    AllFilenameNumber,AllFoldNumber);2[V&k'R8@i
                      str2[m]='\0';
0G8m(e_;c1V Xwww.linuxeden.com                                                     }                                                 Linux伊甸园论坛n ~5n(j*r
                    closedir(dp);
2o-b-HO?[                                                               //关闭目录
5xuSg%NkdLinux伊甸园论坛                    break;
U-E4w}h"~default:        break;Hk&D&`P
}
IFco4HA@$s7O}x+{
hR L"\
n!jwww.linuxeden.com
}@+^9JZ;hh-~`

@J t/a+l!BVint main(int argc,char *argv[])
.Ho)JM(e{:A9aLK6l5J\#L
    !g.@Q/X}
    int AllFileNumber=0;/kfW7O`}O
    int AllDepthNumber=0;
*K/ubD3jN-V8y)O    int AllFilenameNumber=0;
J?)nj`%Awww.linuxeden.com    int AllFoldNumber=0;
z)@$Gbqy
Oo)r
'a8DE6U        lW m)k'`y"i
    func(argv[1],&AllFileNumber,&AllDepthNumber,&AllFilenameNumber,www.linuxeden.comq*q#@M$k        vN)R|+lzU
            &AllFoldNumber);
xG%v9C-w9m$ne+I    printf("The average filenumber is %d\n",AllFileNumber+AllFoldNumber);
+{.G1Wf"a
@*[
    printf("The average fileDepthnumber is %d\n",6g)TX n5w1Y8zs
            AllDepthNumber+AllFoldNumber);Linux伊甸园论坛dK
G;u9M9p
Xb

    printf("The average filenameNumber is %d\n",-PK*@Ro%M.^3@4A(z
              AllFilenameNumber+AllFileNumber);]F*m)} \'~&vj,z
    return 0;X@@Fpr2B1eb        s        @h
}

顶部
 



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

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

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