1479989860 发表于 2022-10-11 18:06:57

C语言第一课课后作业不知道什么问题一直错误

本帖最后由 1479989860 于 2022-10-11 18:06 编辑

#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>

#define MAX 256

long total;

int countLines(const char *filename);
int isCode(const char *filename);
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;
}

int isCode(const char *filename)
{
        int length;

        length = strlen(filename);

        if (!strcmp(filename + (length - 2), ".c"))
        {
                return 1;
        }
        else
        {
                return 0;
        }
}

void findAllDirs(const char *path)
{
        DIR *dp;
        struct dirent *entry;
        struct stat statbuf;

        if ((dp = opendir(path)) == NULL)
        {
                fprintf(stderr,"The path %s is wrong!\n", path);
                return;
        }

        chdir(path);
        while ((entry = readdir(dp)) != NULL)
        {
                lstat(entry->d_name, &statbuf);

                if (!strcmp(".", entry->d_name) || !strcmp("..", entry->d_name))
                        continue;

                if (S_ISDIR(statbuf.st_mode))
                {
                        findAllDirs(entry->d_name);
                }
                else
                {
                        if (isCode(entry->d_name))
                        {
                                total += countLines(entry->d_name);
                        }
                }
        }

        chdir("..");
        closedir(dp);
}

int main()
{
        char path = ".";

        printf("计算中...\n");

        findAllDirs(path);

        printf("目前你总共写了 %1d 行代码! \n\n", total);

        return 0;
}



这个是我的代码,对着小甲鱼的检查了好久都不知道问题在哪。。。。。
执行./a.out后一直显示计算中,然后操作命令也输入不了。
因为发不了图片只能这样描述,给大佬带来的不便请多见谅,第一次学C希望可以帮我看一下错在哪了{:5_100:}

jackz007 发表于 2022-10-11 18:25:42

本帖最后由 jackz007 于 2022-10-11 19:13 编辑

      printf("目前你总共写了 %ld 行代码! \n\n", total);// 目测你把 "ld" 写成了 "1d""l" 是 字母 L 的小写
      你的代码是复制现成的还是自己抄写的?
      因为没有 Linux 环境,无法实际编译、运行,所以,只是粗略看了下代码,似乎没有问题,建议把编译好的代码放到一个单独的子目录内,里面只放一个扩展名为 .c 的源代码文件,然后,再运行试试,应该瞬间就出结果。

1479989860 发表于 2022-10-11 20:26:29

jackz007 发表于 2022-10-11 18:25
你的代码是复制现成的还是自己抄写的?
      因为没有 Linux 环境,无法实际编译、运行,所 ...

自己写了在Linux里复制下来的,运行的话跟着小甲鱼视频上面的输入可以吗,我先去试试!
非常感谢!!!!!{:10_298:}

1479989860 发表于 2022-10-11 20:30:04

本帖最后由 1479989860 于 2022-10-11 20:32 编辑

1479989860 发表于 2022-10-11 20:26
自己写了在Linux里复制下来的,运行的话跟着小甲鱼视频上面的输入可以吗,我先去试试!
非常感谢!!! ...

./test.c:行10: long: 未找到命令
./test.c:行12: 未预期的符号 `(' 附近有语法错误
./test.c:行12: `int countLines(const char *filename);'
现在显示的是这个{:10_266:}

jackz007 发表于 2022-10-11 20:52:02

本帖最后由 jackz007 于 2022-10-11 20:57 编辑

1479989860 发表于 2022-10-11 20:30
./test.c:行10: long: 未找到命令
./test.c:行12: 未预期的符号 `(' 附近有语法错误
./test.c:行12:...

      我在 Windows 下用 gcc 编译,就 72 行一个 lstat() 未定义错误,这是错误信息:
D:\\C>g++ -o x x.c
x.c: In function 'void findAllDirs(const char*)':
x.c:72:46: error: 'lstat' was not declared in this scope
               lstat(entry->d_name, &statbuf);
                                              ^

D:\\C>
      编了个假的给糊弄了一下:
lstat(char * name , struct stat * x)
{
}
      结果,就可以正常编译过去了,无错误,无警告,当然,由于有假函数,不可能正常运行。

      这就至少说明,这个代码真的没有任何的语法错误。

1479989860 发表于 2022-10-12 00:08:54

jackz007 发表于 2022-10-11 20:52
我在 Windows 下用 gcc 编译,就 72 行一个 lstat() 未定义错误,这是错误信息:

      编了 ...

{:10_266:}绝望了,是不是因为我的VBOx和小甲鱼的版本不一样代码识别不了

jackz007 发表于 2022-10-12 00:26:58

本帖最后由 jackz007 于 2022-10-12 00:31 编辑

1479989860 发表于 2022-10-12 00:08
绝望了,是不是因为我的VBOx和小甲鱼的版本不一样代码识别不了

         和 VBOX 及 Linux,甚至和 gcc 都没有直接的关系,编译还是有错误信息?
         像我一样,用命令行
g++ -o test test.c
         编译试试看呢,当然,启动程序需要这样键入命令:
./test

1479989860 发表于 2022-10-12 01:54:13

jackz007 发表于 2022-10-12 00:26
和 VBOX 及 Linux,甚至和 gcc 都没有直接的关系,编译还是有错误信息?
         像我一样 ...

我试了一下,输入之后还是一直显示计算中,但是打其他代码就没什么问题都能正常运行。
就像我现在学到第三课的打印,那个鱼的作业也能正常输出。
我用
gcc test.c -o test
./test
这个也不行,也是显示正在计算中{:10_291:}

jackz007 发表于 2022-10-12 01:57:24

1479989860 发表于 2022-10-12 01:54
我试了一下,输入之后还是一直显示计算中,但是打其他代码就没什么问题都能正常运行。
就像我现在学到第 ...

       这个目录下有很多文件和子目录?

1479989860 发表于 2022-10-12 02:11:50

jackz007 发表于 2022-10-12 01:57
这个目录下有很多文件和子目录?

没有,就一个文件和一个子目录,每个作业我都分开另创文件的

jackz007 发表于 2022-10-12 09:14:50

1479989860 发表于 2022-10-12 02:11
没有,就一个文件和一个子目录,每个作业我都分开另创文件的

      这份代码的关键环节是 findAllDirs() 函数,你先暂时把下面的代码替换到你的源代码中,注意保存好原始代码文件,然后,编译、运行,看看屏显信息是什么,是否符合实际情况。
void findAllDirs(const char *path)
{
      DIR *dp;
      struct dirent *entry;
      struct stat statbuf;

      if ((dp = opendir(path)) == NULL)
      {
                fprintf(stderr,"The path %s is wrong!\n", path);
                return;
      }

      chdir(path);
                printf("进入目录:%s\n\n" , path)                         ; // 【添加】
      while ((entry = readdir(dp)) != NULL)
      {
                lstat(entry->d_name, &statbuf);
                printf("%s" , entry -> d_name)
                if (!strcmp(".", entry->d_name) || !strcmp("..", entry->d_name))
                        continue;
                if (S_ISDIR(statbuf.st_mode))
                {
                                        printf("[目录] - %s\n" , entry->d_name)   ;// 【添加】
                        findAllDirs(entry->d_name);
                }
                else
                {
                                        printf("[文件] - %s\n" , entry->d_name)   ;// 【添加】
                        if (isCode(entry->d_name))
                        {
                              total += countLines(entry->d_name);
                        }
                }
      }

      chdir("..");
                printf("退出目录:%s\n\n" , path)                         ;// 【添加】
      closedir(dp) ;
}

1479989860 发表于 2022-10-13 03:27:22

jackz007 发表于 2022-10-12 09:14
这份代码的关键环节是 findAllDirs() 函数,你先暂时把下面的代码替换到你的源代码中,注意保存 ...

是要怎么替换,是不是要从新建一个文档还是在原有的代码上加上这串代码{:10_245:}
我试了一下新建的好像不可以的样子

jackz007 发表于 2022-10-13 08:20:03

本帖最后由 jackz007 于 2022-10-13 08:23 编辑

1479989860 发表于 2022-10-13 03:27
是要怎么替换,是不是要从新建一个文档还是在原有的代码上加上这串代码
我试了一下新建的好像 ...

   拷贝一份你的代码文件 "test.c",把副本文件重命名为 "x.c",用文本编辑器打开 "x.c",找到findAllDirs() 的函数定义,把属于这个函数的代码全部都删掉,然后,把我贴的代码粘贴到原来这个函数代码的位置,存盘,再编译,再运行。
页: [1]
查看完整版本: C语言第一课课后作业不知道什么问题一直错误