高肆玖捌伍 发表于 2022-9-28 23:59:55

寻求大佬帮助


c语言第一节的课后作业的代码行数统计我一直显示零行,有办法解决吗?win11系统,文件夹里有其他源文件{:5_99:} 谢谢大佬们了

高肆玖捌伍 发表于 2022-9-29 00:01:38

我用的DveC

jackz007 发表于 2022-9-29 00:18:08

本帖最后由 jackz007 于 2022-9-29 00:19 编辑

       解决问题就要把有问题的东西展示出来啊。你感觉 0 行代码的问题出在哪里?不会认为自己真的就写了 0 行代码吧?既然是写了,为什么会 0 行,你告诉我,问题会出在哪里?

高肆玖捌伍 发表于 2022-9-29 08:09:53

D:\桌面QQ\截图20220928235608

高肆玖捌伍 发表于 2022-9-29 08:11:53

jackz007 发表于 2022-9-29 00:18
解决问题就要把有问题的东西展示出来啊。你感觉 0 行代码的问题出在哪里?不会认为自己真的就写了 0 ...

大佬我不会发图片{:5_99:},而且我是第二天学,确实是不知道为什么会这样{:5_99:}

高肆玖捌伍 发表于 2022-9-29 08:18:30


#include <io.h>
#include <direct.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX      256

long total;

int countLines(const char *filename);
void findAllCodes(const char *path);
void findALLFiles(const char *path);

int countLines(const char *filename)
{
      FILE *fp;
      int count = 0;
      int temp;
      
      if ((fp = fopen(filename, "r")) == NULL)
      {
                fprintf(stderr, "Can not open the file:%s\n", filename);
                return 0;
      }
      
      while ((temp = fgetc(fp)) != EOF)
      {
                if (temp == '\n')
                {
                        count++;
                }
      }
      
      fclose(fp);
      
      return count;
}

void findAllCodes(const char *path)
{
      struct _finddata_t fa;
      long handle;
      char thePath, target;
      
      strcpy(thePath, path);
      if((handle = _findfirst(strcat(thePath, "/*.c"), &fa)) != -1L)
      {
                do
                {
                        sprintf(target, "%s/%s", path, fa.name);
                        total += countLines(target);
                }while (_findnext(handle, &fa) == 0);
      }
   
      _findclose(handle);
}

void findALLDirs(const char *path)
{
      struct _finddata_t fa;
      long handle;
      char thePath;
      
      strcpy(thePath, path);
      if((handle = _findfirst(strcat(thePath, "/*"), &fa)) == -1L)
      {
                fprintf(stderr, "The path %s is wrong!\n",path);
                return;
      }
   
      do
      {      
                if (!strcmp(fa.name, ".") || !strcmp(fa.name, ".."))
                        continue;
                  
                if( fa.attrib == _A_SUBDIR)
                {      
                        sprintf(thePath, "%s/%s", path, fa.name);
                        findAllCodes(thePath);
                        findALLDirs(thePath);
                }
      }while (_findnext(handle, &fa) == 0);
   
      _findclose(handle);   
}

int main()
{
      char path = ".";
      
      printf("计算中...\n");
      
      findAllCodes(path);
      findALLDirs(path);
      
      printf("目前你总共写了 %ld 行代码!\n\n", total);
      system("pause");
      
      return 0;
}

高肆玖捌伍 发表于 2022-9-29 08:24:26

高肆玖捌伍 发表于 2022-9-29 08:18
#include
#include
#include


代码就是这个样子,我怕抄错了又复制了一次还是0行,源文件路径是D:\C\summary

jackz007 发表于 2022-9-29 09:36:47

本帖最后由 jackz007 于 2022-9-29 10:12 编辑

高肆玖捌伍 发表于 2022-9-29 08:24
代码就是这个样子,我怕抄错了又复制了一次还是0行,源文件路径是D:\C\summary

         这个代码是正确的,这个代码统计的是当前程序所在目录及其各级子目录内所有文件名可以匹配 "*.c" 的文件。
         试试我修改的版本吧,我修改的这个版本除了统计 ".c" 外,还统计 ".h"、".cpp" 文件,并显示每一个被统计文件的路径和行数。
#include <io.h>
#include <direct.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX      256

int countLines(const char * filename)
{
      char ch                                                                        ;
      FILE * fp                                                                        ;
      int c                                                                            ;
      if((fp = fopen(filename , "r"))) {
                for(c = 0 ; (ch = fgetc(fp)) != EOF ;) if(ch == '\n') c ++               ;
                fclose(fp)                                                               ;
      }else {
                fprintf(stderr , "Can not open the file : %s\n" , filename)            ;
      }
      printf("[%3d] - %s\n" , c , filename)                                          ;   
      return c                                                                         ;
}

int findALLDirs(const char * path)
{
      struct _finddata_t fa                                                            ;
      long handle                                                                      ;
      char thePath                                                                ;
      int i , k , n , r = 0                                                            ;
      strcpy(thePath , path)                                                         ;
      if((handle = _findfirst(strcat(thePath , "/*") , & fa)) != EOF) {
                do {
                        if(strcmp(fa . name , ".") && strcmp(fa . name , "..")) {
                              sprintf(thePath , "%s/%s" , path , fa . name)            ;
                              if(fa . attrib == _A_SUBDIR) {
                                        r += findALLDirs(thePath)                        ;
                              } else {
                                        for(n = 0 ; fa . name ; n ++)               ;
                                        for(k = n ; k && fa . name != '.' ; k --) ;
                                        if(fa . name == '.') {
                                                if(! stricmp(& fa . name , ".c") || ! stricmp(& fa . name , ".h") || ! stricmp(& fa . name , ".cpp")) {
                                                      r += countLines(thePath)         ;      
                                                }
                                        }            
                              }
                        }
                } while(! _findnext(handle , & fa))                                    ;
                _findclose(handle)                                                       ;   
      } else {
                fprintf(stderr, "The path %s is wrong!\n" , path)                        ;
      }
      return r                                                                         ;
}

int main(void)
{
      char path = "."                                                             ;
      printf("计算中...\n")                                                            ;
      printf("目前你总共写了 %d 行代码!\n\n" , findALLDirs(path))                     ;
      system("pause")                                                                  ;
}

高肆玖捌伍 发表于 2022-9-29 19:09:56

jackz007 发表于 2022-9-29 09:36
这个代码是正确的,这个代码统计的是当前程序所在目录及其各级子目录内所有文件名可以匹配 "* ...

感谢大佬感谢大佬,问题解决了{:5_106:}
页: [1]
查看完整版本: 寻求大佬帮助