ljfyyds 发表于 2024-9-25 21:47:36

求助

课后作业一为什么老是运行错误

FishC 发表于 2024-9-25 21:54:25

请问可以提供具体的代码和错误信息吗?这样我可以更好地帮你找出问题所在。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

FishC 发表于 2024-9-25 21:55:15

好的鱼油,请先别着急。我们可以一步一步来解决问题。请告诉我你的代码和报错信息,这样我可以更准确地帮你找到问题所在。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

ljfyyds 发表于 2024-9-26 22:49:02

本帖最后由 ljfyyds 于 2024-9-26 22:54 编辑

FishC 发表于 2024-9-25 21:54
请问可以提供具体的代码和错误信息吗?这样我可以更好地帮你找出问题所在。

以上回复来自 FishC AI 小助 ...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <direct.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_s(&fp,filename, "r")) == NULL) {
      perror("Error opening file");
      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;
   
    snprintf(thePath, MAX, "%s/*.c", path); // Use snprintf to avoid buffer overflow
    if ((handle = _findfirst(thePath, &fa)) != -1L) {
      do {
            snprintf(target, MAX, "%s/%s", path, fa.name);
            total += countLines(target);
      } while (_findnext(handle, &fa) == 0);
    } else {
      fprintf(stderr, "No .c files found in directory: %s\n", path);
    }
   
    _findclose(handle);
}

void findAllDirs(const char *path) {
    struct _finddata_t fa;
    long handle;
    char thePath;
   
    snprintf(thePath, MAX, "%s/*", path); // Use snprintf to avoid buffer overflow
    if ((handle = _findfirst(thePath, &fa)) == -1L) {
      fprintf(stderr, "The path %s is wrong or cannot be accessed!\n", path);
      return;
    }
   
    do {      
      if (!strcmp(fa.name, ".") || !strcmp(fa.name, ".."))
            continue;
                  
      if (fa.attrib & _A_SUBDIR) {      
            snprintf(thePath, MAX, "%s/%s", path, fa.name);
            findAllCodes(thePath);
            findAllDirs(thePath);
      }
    } while (_findnext(handle, &fa) == 0);
   
    _findclose(handle);   
}

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

    total = 0; // Initialize total
    printf("Calculating...\n");
   
    findAllCodes(path);
    findAllDirs(path);
   
    printf("You have written %ld lines of code in total!\n\n", total);
    system("pause");
   
    return 0;
}

FishC 发表于 2024-9-26 22:49:18

ljfyyds 发表于 2024-09-26 22:49
#include
#include
#include
#include
#inclu ...

好,先来看代码中的几个可能导致运行错误的问题:

1. **包含头文件部分**:你应该显式地包含必要的头文件,如 `<stdio.h>` 和 `<io.h>`。
   
2. **文件打开方式**:`fopen_s` 用法不正确。`fopen_s` 的正确使用方法如下:
   if (fopen_s(&fp, filename, "r") != 0) {
       perror("Error opening file");
       fprintf(stderr, "Can not open the file: %s\n", filename);
       return 0;
   }

3. **字符数组定义与传参**:字符数组定义不正确,使用动态分配或更安全的字符数组传参方式。`snprintf` 使用时目标参数要定义为字符数组。

4. **`findAllDirs` 函数未完成**:函数未完整,加入适当的函数退出条件。

改进后的代码如下:

#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define MAX 256

long total = 0;

int countLines(const char* filename) {
    FILE* fp;
    int count = 0;
    int temp;

    if (fopen_s(&fp, filename, "r") != 0) {
      perror("Error opening file");
      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;

    snprintf(thePath, MAX, "%s/*.c", path); // Use snprintf to avoid buffer overflow
    if ((handle = _findfirst(thePath, &fa)) != -1L) {
      do {
            snprintf(target, MAX, "%s/%s", path, fa.name);
            total += countLines(target);
      } while (_findnext(handle, &fa) == 0);
      _findclose(handle);
    } else {
      fprintf(stderr, "No .c files found in directory: %s\n", path);
    }
}

void findAllDirs(const char* path) {
    struct _finddata_t fa;
    long handle;
    char thePath;

    snprintf(thePath, MAX, "%s/*", path); // Use snprintf to avoid buffer overflow
    if ((handle = _findfirst(thePath, &fa)) != -1L) {
      do {
            if (fa.attrib & _A_SUBDIR) {
                if (strcmp(fa.name, ".") != 0 && strcmp(fa.name, "..") != 0) {
                  char subdir;
                  snprintf(subdir, MAX, "%s/%s", path, fa.name);
                  findAllCodes(subdir);
                  findAllDirs(subdir);
                }
            }
      } while (_findnext(handle, &fa) == 0);
      _findclose(handle);
    }
}

int main() {
    const char* dir = "path_to_your_directory";// 替换为你想要遍历的目录
    findAllDirs(dir);
    printf("Total lines: %ld\n", total);
    return 0;
}

改了这几处之后,再运行代码看看是否解决了问题。如果依然有问题,请提供具体的错误信息。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

ljfyyds 发表于 2024-9-26 23:01:02

FishC 发表于 2024-9-26 22:49
好,先来看代码中的几个可能导致运行错误的问题:

1. **包含头文件部分**:你应该显式地包含必要的 ...

} while (_findnext(handle, &fa) == 0);
运行时这行代码出现以下:
0x00007FFC14671A9D (ntdll.dll)处(位于 Project1.exe 中)引发的异常: 0xC0000005: 写入位置 0x000000002047E540 时发生访问冲突。

FishC 发表于 2024-9-26 23:01:17

ljfyyds 发表于 2024-09-26 23:01
} while (_findnext(handle, &fa) == 0);
运行时这行 ...

根据你提供的错误信息,出现了内存访问冲突问题。这个问题通常是由于访问了未初始化或者非法的内存地址造成的。我们来逐步检查并修正代码中的问题。

### 主要问题和改正措施:

1. **字符数组初始化问题**:
   确保字符数组有足够的空间来存储字符串。

2. **文件打开函数fopen_s的用法**:
   `fopen_s` 的用法不正确,应该是 `fopen(filename, "r")`。

3. **使用`snprintf`的字符数组未正确初始化**:
   `thePath`和`target`需要被定义为字符数组而不是字符。

4. **路径拼接格式不对**:
   Windows 系统路径使用的是反斜杠 `\`,不过为了适应跨平台,建议使用斜杠 `/`。

以下是修改后的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.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) {
      perror("Error opening file");
      fprintf(stderr, "Cannot 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;
    char target;

    snprintf(thePath, MAX, "%s/*.c", path); // Use snprintf to avoid buffer overflow

    if ((handle = _findfirst(thePath, &fa)) != -1L) {
      do {
            snprintf(target, MAX, "%s/%s", path, fa.name);
            total += countLines(target);
      } while (_findnext(handle, &fa) == 0);
    } else {
      fprintf(stderr, "No .c files found in directory: %s\n", path);
    }

    _findclose(handle);
}

void findAllDirs(const char *path) {
    struct _finddata_t fa;
    long handle;
    char thePath;

    snprintf(thePath, MAX, "%s/*", path); // Use snprintf to avoid buffer overflow

    if ((handle = _findfirst(thePath, &fa)) == -1L) {
      fprintf(stderr, "The path %s is wrong or cannot be accessed!\n", path);
      return;
    }

    do {      
      if (strcmp(fa.name, ".") == 0 || strcmp(fa.name, "..") == 0)
            continue;

      if (fa.attrib & _A_SUBDIR) {      
            snprintf(thePath, MAX, "%s/%s", path, fa.name);
            findAllCodes(thePath);
            findAllDirs(thePath);
      }
    } while (_findnext(handle, &fa) == 0);

    _findclose(handle);   
}

int main() {
    const char* path = "."; // Change char to const char* to avoid confusion

    total = 0; // Initialize total
    printf("Calculating...\n");
   
    findAllCodes(path);
    findAllDirs(path);
   
    printf("You have written %ld lines of code in total!\n\n", total);
    system("pause");
   
    return 0;
}

### 总结:
- 将字符数组正确地初始化为具有足够空间的字符数组。
- 修正文件打开方式`fopen_s`。
- 正确使用`snprintf`来防止缓冲区溢出。
- 建议保持代码风格一致,用`/`符号代替反斜杠来处理路径,便于跨平台兼容。

试着运行一下这个修改后的代码,看是否能够解决问题。如果还有问题,记得把具体的错误信息贴上来,我们再一起看看。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

ljfyyds 发表于 2024-9-26 23:03:59

FishC 发表于 2024-9-26 23:01
根据你提供的错误信息,出现了内存访问冲突问题。这个问题通常是由于访问了未初始化或者非法的内存地址 ...

还是和刚刚一样的问题

FishC 发表于 2024-9-26 23:15:53

ljfyyds 发表于 2024-09-26 23:03
还是和刚刚一样的问题

要解决问题,首先需要了解一些具体信息:您使用的是什么编程语言?是哪道题目?发生了什么样的错误信息?只有这样才能更准确地帮您。

如果您能提供这些细节,我会帮您一步一步解决这个问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

ljfyyds 发表于 2024-9-27 11:40:36

} while (_findnext(handle, &fa) == 0);
运行时这行代码出现以下:
0x00007FFC14671A9D (ntdll.dll)处(位于 Project1.exe 中)引发的异常: 0xC0000005: 写入位置 0x000000002047E540 时发生访问冲突。

FishC 发表于 2024-9-27 11:40:42

ljfyyds 发表于 2024-09-27 11:40
} while (_findnext(handle, &fa) == 0);
运行时这行 ...

根据你提供的信息,使用的是C/C++语言,并且代码包含了文件查找函数 `_findnext`。这个错误通常表明你访问了无效的内存地址。请确认一下以下几点:

1. **变量初始化**:
   确保 `handle` 和 `fa` 都已正确初始化。

   struct _finddata_t fa;
   intptr_t handle = _findfirst("your_pattern", &fa);
   if (handle == -1) {
       // 错误处理
   }

2. **正确关闭查找**:
   使用 `_findclose` 函数在结束查找后关闭句柄。

   while (_findnext(handle, &fa) == 0) {
       // 遍历逻辑
   }
   _findclose(handle);

3. **错误处理**:
   确保在找到文件之前检查 `_findfirst` 的返回值,并处理可能的错误。

一个完整的示例代码如下:

#include <stdio.h>
#include <io.h>

int main() {
    struct _finddata_t fa;
    intptr_t handle = _findfirst("C:\\path\\to\\search\\*", &fa);

    if (handle == -1) {
      printf("没有找到任何文件\n");
      return 1; // 或其他错误处理逻辑
    }

    do {
      printf("找到文件: %s\n", fa.name);
    } while (_findnext(handle, &fa) == 0);

    _findclose(handle);
    return 0;
}

请检查上面的几点并确保所有变量都正确初始化和处理,这样就能避免内存访问冲突的问题。希望这能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求助