求大佬帮看看,C语言S1E2第一次作业
小甲鱼给的答案是计算中...
目前你总共写了101行代码
但我运行的结果是
计算中...
就少了后面那一句。文件后缀也改成了.c了,眼睛都看花了也没找出来代码有什么不一样的。用的是vs2022,求大佬帮忙,十分感谢!
作业原帖:https://fishc.com.cn/forum.php?mod=viewthread&tid=66283&extra=page%3D1%26filter%3Dtypeid%26typeid%3D570
#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_s(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_s(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_s("目前你总共写了 %l d 行代码!\n\n", total);
system("pause");
return 0;
}
本帖最后由 jackz007 于 2022-10-9 15:39 编辑
这一行能不能看出问题?
printf_s("目前你总共写了 %l d 行代码!\n\n", total);
显然应该是这样
printf_s("目前你总共写了 %ld 行代码!\n\n", total);
代码没有问题,只要改了就好了。 本帖最后由 jhq999 于 2022-10-9 15:47 编辑
#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_s(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_s("目前你总共写了 %d行代码!\n\n", total);////////////////
system("pause");
return 0;
}
计算中...
目前你总共写了 102行代码!
请按任意键继续. . . 我不知道你用的是哪个包哈,我用的C++系列的包,源文件后缀就是.cpp而不是.c,C语言我不是很清楚。
另外有一点值得注意,VS里边生成的可执行文件(.exe)和代码源文件(.c或者.cpp)好像不在一个目录下,所以文件名必须带路径,也就是你main函数下的path字符串是要带路径的。 jackz007 发表于 2022-10-9 15:38
这一行能不能看出问题?
显然应该是这样
vs上看是正常的,复制过来不知道为什么变这样了。刚刚把你的复制上去了,还是原来那样,但是感谢大佬帮助{:10_302:} jhq999 发表于 2022-10-9 15:45
感谢帮忙,但好像还是行不通{:10_266:} BPN-06 发表于 2022-10-11 14:42
vs上看是正常的,复制过来不知道为什么变这样了。刚刚把你的复制上去了,还是原来那样,但是感谢大佬帮助 ...
如果没有改观,那就至少可以说明,你编译好的 exe 文件没有和你的 .c 的源代码文件处在同一个目录。你可以把源代码文件复制到 exe 文件的目录下,也可以把随便一个文本文件复制到 exe 目录下,并把文件扩展名改为 .c,然后再试一下。 摸鱼的兔崽子 发表于 2022-10-9 23:35
我不知道你用的是哪个包哈,我用的C++系列的包,源文件后缀就是.cpp而不是.c,C语言我不是很清楚。
另外有 ...
我的源文件后缀原本是.cpp,之前看了别人的帖子然后改成了.c。大佬救一救,path字符串怎么带路径。我有看到一个帖子写的代码是 with open(r'路径’),大标题是《path路径的写法》,小标题是 绝对路径。我也不知道是不是,但我也找不到 看起来更有用的帖了{:10_250:} jackz007 发表于 2022-10-11 14:50
如果没有改观,那就至少可以说明,你编译好的 exe 文件没有和你的 .c 的源代码文件处在同一个 ...
好像还是不可以,我是憨憨。我在原来的项目A里的解决方案资源管理器,右击源文件,新建了一个项目B.c,然后移除了A.cpp,再把B.c放到含有A.exe的debug文件夹里,这样会有问题吗?直接把A.cpp改成A.c会显示找不到文件 BPN-06 发表于 2022-10-11 16:32
好像还是不可以,我是憨憨。我在原来的项目A里的解决方案资源管理器,右击源文件,新建了一个项目B.c,然 ...
难道你真的不知道自己编译好的 exe 文件存在哪个目录??? BPN-06 发表于 2022-10-11 15:38
我的源文件后缀原本是.cpp,之前看了别人的帖子然后改成了.c。大佬救一救,path字符串怎么带路径。我有看 ...
既然你的源文件后缀是cpp那就用cpp,不要用c,因为别人的环境不一样,软件不一样,所以源文件格式不一样,.c应该是linux下C语言的后缀。
路径问题,可以采用绝对路径,就是把要查代码的文件夹打开,然后复制文件地址(从盘开始的,比如C:\叽哩哇啦\莫西莫西)然后贴进去,你原来那个“.”我不是很明白,因为我对这套代码不是很熟。也可以采用相对路径,就是以“..”作为一个符号表明返回上一级文件夹,比如exe在/a/b/c这个目录下边,但是要查的源文件在/a下边,叫做“what.cpp”,那在fopen的时候给的完整路径就是“..\\..\\what.cpp”,这叫做相对路径。具体可以在csdn查一下C语言相对路径的使用,大部分讲的还是很清楚的。
你这个代码我不知道为啥路径寻找老是报错,不管是相对路径还是绝对路径都报错,应该是那个FindAllDirs函数和这个方法之间有不匹配,这我就不是很清楚了,因为我这个函数真没看懂。
但是我另写了一个简单的程序试了一下,单纯使用fopen去查某个特定的文件的行数,用绝对路径相对路径都是没有问题的。
页:
[1]