鱼C课程第二节课的C语言写的代码行计算程序不出计算结果,仅输出计算中。
https://fishc.com.cn/thread-66283-1-1.html 关于代码行统计程序无法输出结果的问题分析根据问题描述,程序卡在输出"计算中"但无最终结果,常见原因及解决方法如下:
[*]文件路径问题:未正确打开文件,建议:
FILE *fp = fopen("你的文件路径", "r");
if (fp == NULL) {
printf("无法打开文件!\n");
return 1; // 增加错误处理
}
[*]未处理空文件:文件可能为空,添加判断:
fseek(fp, 0, SEEK_END);
if (ftell(fp) == 0) {
printf("空文件!\n");
return 1;
}
rewind(fp); // 重置文件指针
[*]死循环问题:检查 while(!feof(fp)) 循环是否未正确读取内容,建议改用:
char buffer;
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
// 处理每一行
}
[*]未刷新输出缓冲区:在长时间操作前添加:
printf("计算中...");
fflush(stdout); // 强制刷新输出缓冲区
建议调试步骤
1. 添加文件存在性检查
2. 在循环内增加临时打印(如当前处理行号)
3. 检查是否卡在特定文件(如超大文件需要优化处理逻辑)
完整调试示例:
#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;
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;
}
请特别注意:isCodeLine() 函数的实现是否正确处理以下情况:
[*]空行(只有空格/换行)
[*]单行注释(//)
[*]多行注释(/* ... */)
需要具体代码实现可提供你的判断函数,我会继续帮忙分析!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 遇到问题了吗? FishC 发表于 2025-5-26 18:13
关于代码行统计程序无法输出结果的问题分析
根据问题描述,程序卡在输出"计算中"但无最终结果,常见原因 ...
void findALLFiles(const char *path);
说是没有定义这个 不二如是 发表于 2025-5-26 18:52
遇到问题了吗?
C语言课后作业二,Windows10环境下的代码行计算程序不输出结果,仅仅输出计算中,然后没有报错,查看代码发现void findALLFiles(const char *path);这行没有定义,如何解决呢? 本帖最后由 不二如是 于 2025-5-26 19:29 编辑
海牛1010KG 发表于 2025-5-26 18:57
C语言课后作业二,Windows10环境下的代码行计算程序不输出结果,仅仅输出计算中,然后没有报错,查看代码 ...
假设代码没错,显示未定义,首先要知道声明 ≠ 定义:只有声明、没有实现,功能就成了“空壳”。
补上 findALLFiles 的实现,或者把已有实现编入工程,程序就能从“计算中…”走到真正输出结果。
最好完整代码发来我看下哈 帮你叫个人 @sfqxx 海牛1010KG 发表于 2025-5-26 18:55
说是没有定义这个
将其改成 “void findALLDirs(const char *path);” 即可。 小甲鱼的二师兄 发表于 2025-5-26 20:28
将其改成 “void findALLDirs(const char *path);” 即可。
是小甲鱼的问题,上面声明写的是 void findALLFiles,下面实现写的是 void findALLDirs,已经通知他修改过来啦~ 小甲鱼的二师兄 发表于 2025-5-26 20:30
是小甲鱼的问题,上面声明写的是 void findALLFiles,下面实现写的是 void findALLDirs,已经通知他修改 ...
老师,我修改了你说的定义名称之后还是仅仅输出“计算中...”并没有代码行数结果,以下是我修改后的源代码:
#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 findALLDirs(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;
}
小甲鱼的二师兄 发表于 2025-5-26 20:30
是小甲鱼的问题,上面声明写的是 void findALLFiles,下面实现写的是 void findALLDirs,已经通知他修改 ...
或者我应该重装VScode吗?
页:
[1]