鱼C论坛

 找回密码
 立即注册
查看: 3911|回复: 12

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

[复制链接]
发表于 2022-10-11 18:06:57 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 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[MAX] = ".";

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

        findAllDirs(path);

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

        return 0;
}



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

使用道具 举报

发表于 2022-10-11 18:25:42 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-11 19:13 编辑
  1.         printf("目前你总共写了 %ld 行代码! \n\n", total);  // 目测你把 "ld" 写成了 "1d"  "l" 是 字母 L 的小写
复制代码

        你的代码是复制现成的还是自己抄写的?
        因为没有 Linux 环境,无法实际编译、运行,所以,只是粗略看了下代码,似乎没有问题,建议把编译好的代码放到一个单独的子目录内,里面只放一个扩展名为 .c 的源代码文件,然后,再运行试试,应该瞬间就出结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

自己写了在Linux里复制下来的,运行的话跟着小甲鱼视频上面的输入可以吗,我先去试试!
非常感谢!!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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);'
现在显示的是这个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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() 未定义错误,这是错误信息:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c
  2. x.c: In function 'void findAllDirs(const char*)':
  3. x.c:72:46: error: 'lstat' was not declared in this scope
  4.                  lstat(entry->d_name, &statbuf);
  5.                                               ^

  6. D:\[00.Exerciese.2022]\C>
复制代码

      编了个假的给糊弄了一下:
  1. lstat(char * name , struct stat * x)
  2. {
  3. }
复制代码

      结果,就可以正常编译过去了,无错误,无警告,当然,由于有假函数,不可能正常运行。

      这就至少说明,这个代码真的没有任何的语法错误。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-12 00:08:54 | 显示全部楼层
jackz007 发表于 2022-10-11 20:52
我在 Windows 下用 gcc 编译,就 72 行一个 lstat() 未定义错误,这是错误信息:

      编了 ...

绝望了,是不是因为我的VBOx和小甲鱼的版本不一样代码识别不了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-12 00:26:58 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-12 00:31 编辑
1479989860 发表于 2022-10-12 00:08
绝望了,是不是因为我的VBOx和小甲鱼的版本不一样代码识别不了


         和 VBOX 及 Linux,甚至和 gcc 都没有直接的关系,编译还是有错误信息?
         像我一样,用命令行
  1. g++ -o test test.c
复制代码

         编译试试看呢,当然,启动程序需要这样键入命令:
  1. ./test
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-12 01:54:13 | 显示全部楼层
jackz007 发表于 2022-10-12 00:26
和 VBOX 及 Linux,甚至和 gcc 都没有直接的关系,编译还是有错误信息?
         像我一样 ...

我试了一下,输入之后还是一直显示计算中,但是打其他代码就没什么问题都能正常运行。
就像我现在学到第三课的打印,那个鱼的作业也能正常输出。
我用
gcc test.c -o test
./test
这个也不行,也是显示正在计算中
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

       这个目录下有很多文件和子目录?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-12 02:11:50 | 显示全部楼层
jackz007 发表于 2022-10-12 01:57
这个目录下有很多文件和子目录?

没有,就一个文件和一个子目录,每个作业我都分开另创文件的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-12 09:14:50 | 显示全部楼层
1479989860 发表于 2022-10-12 02:11
没有,就一个文件和一个子目录,每个作业我都分开另创文件的

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

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

  11.         chdir(path);
  12.                 printf("进入目录:%s\n\n" , path)                         ; // 【添加】
  13.         while ((entry = readdir(dp)) != NULL)
  14.         {
  15.                 lstat(entry->d_name, &statbuf);
  16.                 printf("%s" , entry -> d_name)
  17.                 if (!strcmp(".", entry->d_name) || !strcmp("..", entry->d_name))
  18.                         continue;
  19.                 if (S_ISDIR(statbuf.st_mode))
  20.                 {
  21.                                         printf("[目录] - %s\n" , entry->d_name)   ;  // 【添加】
  22.                         findAllDirs(entry->d_name);
  23.                 }
  24.                 else
  25.                 {
  26.                                         printf("[文件] - %s\n" , entry->d_name)   ;  // 【添加】
  27.                         if (isCode(entry->d_name))
  28.                         {
  29.                                 total += countLines(entry->d_name);
  30.                         }
  31.                 }
  32.         }

  33.         chdir("..");
  34.                 printf("退出目录:%s\n\n" , path)                         ;  // 【添加】
  35.         closedir(dp) ;
  36. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-13 03:27:22 | 显示全部楼层
jackz007 发表于 2022-10-12 09:14
这份代码的关键环节是 findAllDirs() 函数,你先暂时把下面的代码替换到你的源代码中,注意保存 ...

是要怎么替换,是不是要从新建一个文档还是在原有的代码上加上这串代码
我试了一下新建的好像不可以的样子
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-13 08:20:03 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2022-10-13 08:23 编辑
1479989860 发表于 2022-10-13 03:27
是要怎么替换,是不是要从新建一个文档还是在原有的代码上加上这串代码
我试了一下新建的好像 ...


     拷贝一份你的代码文件 "test.c",把副本文件重命名为 "x.c",用文本编辑器打开 "x.c",找到findAllDirs() 的函数定义,把属于这个函数的代码全部都删掉,然后,把我贴的代码粘贴到原来这个函数代码的位置,存盘,再编译,再运行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 08:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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