鱼C论坛

 找回密码
 立即注册
查看: 124|回复: 10

[已解决]鱼C课程第二节课的C语言写的代码行计算程序不出计算结果,仅输出计算中。

[复制链接]
发表于 2025-5-26 18:12:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
https://fishc.com.cn/thread-66283-1-1.html
最佳答案
2025-5-26 20:28:52


将其改成 “void findALLDirs(const char *path);” 即可。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-5-26 18:13:55 | 显示全部楼层
关于代码行统计程序无法输出结果的问题分析

根据问题描述,程序卡在输出"计算中"但无最终结果,常见原因及解决方法如下:

  • 文件路径问题:未正确打开文件,建议:
    [code=c]
    FILE *fp = fopen("你的文件路径", "r");
    if (fp == NULL) {
        printf("无法打开文件!\n");
        return 1; // 增加错误处理
    }
    [/code]
  • 未处理空文件:文件可能为空,添加判断:
    [code=c]
    fseek(fp, 0, SEEK_END);
    if (ftell(fp) == 0) {
        printf("空文件!\n");
        return 1;
    }
    rewind(fp); // 重置文件指针
    [/code]
  • 死循环问题:检查 while(!feof(fp)) 循环是否未正确读取内容,建议改用:
    [code=c]
    char buffer[1024];
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        // 处理每一行
    }
    [/code]
  • 未刷新输出缓冲区:在长时间操作前添加:
    [code=c]
    printf("计算中...");
    fflush(stdout); // 强制刷新输出缓冲区
    [/code]


建议调试步骤
1. 添加文件存在性检查
2. 在循环内增加临时打印(如当前处理行号)
3. 检查是否卡在特定文件(如超大文件需要优化处理逻辑)

完整调试示例:
[code=c]
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int isCodeLine(char *line) {
    // 实现你的空行/注释判断逻辑
}

int main() {
    FILE *fp = fopen("test.c", "r");
    if (!fp) {
        printf("错误:文件打开失败!\n");
        return 1;
    }

    int count = 0;
    char line[1024];
    printf("计算中...");
    fflush(stdout);

    while (fgets(line, sizeof(line), fp)) {
        printf("正在处理:%s", line); // 调试输出
        if (isCodeLine(line)) {
            count++;
        }
    }

    printf("\n有效代码行数:%d\n", count);
    fclose(fp);
    return 0;
}
[/code]

请特别注意:isCodeLine() 函数的实现是否正确处理以下情况:
  • 空行(只有空格/换行)
  • 单行注释(//)
  • 多行注释(/* ... */)


需要具体代码实现可提供你的判断函数,我会继续帮忙分析!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-5-26 18:52:52 | 显示全部楼层
遇到问题了吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-26 18:55:17 | 显示全部楼层
FishC 发表于 2025-5-26 18:13
关于代码行统计程序无法输出结果的问题分析

根据问题描述,程序卡在输出"计算中"但无最终结果,常见原因 ...
  1. void findALLFiles(const char *path);
复制代码

说是没有定义这个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-26 18:57:45 | 显示全部楼层

C语言课后作业二,Windows10环境下的代码行计算程序不输出结果,仅仅输出计算中,然后没有报错,查看代码发现
  1. void findALLFiles(const char *path);
复制代码
这行没有定义,如何解决呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-5-26 19:27:25 | 显示全部楼层
本帖最后由 不二如是 于 2025-5-26 19:29 编辑
海牛1010KG 发表于 2025-5-26 18:57
C语言课后作业二,Windows10环境下的代码行计算程序不输出结果,仅仅输出计算中,然后没有报错,查看代码 ...


假设代码没错,显示未定义,首先要知道声明 ≠ 定义:只有声明、没有实现,功能就成了“空壳”。

补上 findALLFiles 的实现,或者把已有实现编入工程,程序就能从“计算中…”走到真正输出结果。

最好完整代码发来我看下哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-5-26 19:44:37 From FishC Mobile | 显示全部楼层
帮你叫个人 @sfqxx
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2025-5-26 20:28:52 | 显示全部楼层    本楼为最佳答案   


将其改成 “void findALLDirs(const char *path);” 即可。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-5-26 20:30:03 | 显示全部楼层
小甲鱼的二师兄 发表于 2025-5-26 20:28
将其改成 “void findALLDirs(const char *path);” 即可。

是小甲鱼的问题,上面声明写的是 void findALLFiles,下面实现写的是 void findALLDirs,已经通知他修改过来啦~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
小甲鱼的二师兄 发表于 2025-5-26 20:30
是小甲鱼的问题,上面声明写的是 void findALLFiles,下面实现写的是 void findALLDirs,已经通知他修改 ...

老师,我修改了你说的定义名称之后还是仅仅输出“计算中...”并没有代码行数结果,以下是我修改后的源代码:

  1. #include <io.h>
  2. #include <direct.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>

  6. #define Max 256

  7. long total;

  8. int countLines(const char *filename);
  9. void findAllCodes(const char *path);
  10. void findALLDirs(const char *path);

  11. int countLines(const char *filename)
  12. {
  13.     FILE *fp;
  14.     int count = 0;
  15.     int temp;

  16.     if ((fp = fopen(filename,"r")) == NULL)
  17.     {
  18.         fprintf(stderr,"Can not open the file:%s\n",filename);
  19.         return 0;
  20.     }

  21.     while ((temp = fgetc(fp)) !=EOF)
  22.     {
  23.         if (temp == '\n')
  24.         {
  25.             count++;
  26.         }
  27.     }

  28.     fclose(fp);

  29.     return count;
  30. }

  31. void findAllCodes(const char *path)
  32. {
  33.     struct _finddata_t fa;
  34.     long handle;
  35.     char thePath[Max],target[Max];

  36.     strcpy(thePath,path);
  37.     if((handle = _findfirst(strcat(thePath,"/*.c"),&fa)) != -1L);
  38.     {
  39.         do
  40.         {
  41.             sprintf (target,"%s/%s", path, fa.name);
  42.             total += countLines(target);
  43.         } while (_findnext(handle,&fa) == 0);
  44.     }

  45.     _findclose(handle);
  46. }

  47. void findALLDirs(const char *path)
  48. {
  49.     struct _finddata_t fa;
  50.     long handle;
  51.     char thePath[Max];

  52.     strcpy(thePath,path);
  53.     if((handle = _findfirst(strcat(thePath,"/*"),&fa)) == -1L)
  54.     {
  55.         fprintf(stderr,"The path %s is wrong!\n",path);
  56.         return;
  57.     }

  58.     do
  59.     {
  60.         if(!strcmp(fa.name, ".") || !strcmp(fa.name,".."))
  61.         continue;

  62.         if( fa.attrib == _A_SUBDIR)
  63.         {
  64.             sprintf(thePath,"%s/%s",path,fa.name);
  65.             findAllCodes(thePath);
  66.             findALLDirs(thePath);
  67.         }
  68.     }while (_findnext(handle,&fa) == 0);

  69.     _findclose(handle);
  70. }

  71. int main()
  72. {
  73.     char path[Max] = ".";

  74.     printf("计算中...\n");
  75.    
  76.     findAllCodes(path);
  77.     findALLDirs(path);

  78.     printf("目前你总共写了 %ld 行代码!\n\n", total);
  79.     system("pause");

  80.     return 0;
  81. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
小甲鱼的二师兄 发表于 2025-5-26 20:30
是小甲鱼的问题,上面声明写的是 void findALLFiles,下面实现写的是 void findALLDirs,已经通知他修改 ...

或者我应该重装VScode吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-3 01:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表