鱼C论坛

 找回密码
 立即注册
查看: 646|回复: 4

[已解决]课后作业中同一个代码在不同编辑器中编译运行出不同结果是什么回事呢?

[复制链接]
发表于 2023-8-21 21:07:47 | 显示全部楼层 |阅读模式

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

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

x
代码如下
#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(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[MAX], target[MAX];
        
        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[MAX];
        
        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[MAX] = ".";
        
        printf("计算中...\n");
        
        findAllCodes(path);
        findALLDirs(path);
        
        printf("目前你总共写了 %ld 行代码!\n\n", total);
        system("pause");
        
        return 0;
}
系统是windows
编辑器为Dev-C++时,结果为106
编辑器为vscode时,结果为0
最佳答案
2023-8-21 21:08:51
出现在不同编辑器中编译运行出不同结果的原因可能有以下几个可能性:

1. 编译环境不同:不同的编辑器可能使用不同的编译器或编译选项,这可能导致在某些情况下代码的行为不一致。例如,某些编译器可能对未定义的行为进行不同的处理,导致程序的输出结果不同。

2. 版本差异:不同的编辑器和编译器版本可能存在差异,这可能导致编译器对语言标准的支持程度不同,或者在实现某些特性时存在差异,从而导致代码在不同环境下的运行结果不同。

3. 路径和文件处理差异:不同的操作系统和编辑器可能对路径和文件处理有不同的方式。这可能导致代码在不同环境下找不到文件或发生其他错误。

对于您提供的代码来说,主要问题可能是路径处理的差异。代码中使用了 Windows 特定的函数 _findfirst_findnext 来遍历文件和目录,在不同的环境下可能会导致不同的结果。

为了解决这个问题,您可以考虑使用跨平台的库和函数,如 <dirent.h><sys/stat.h>,来获取文件和目录信息,并改写代码以适应不同的操作系统和编辑器。这样可以提高代码的可移植性和兼容性。

另外,您在代码中使用了一些 Windows 特定的头文件 <io.h><direct.h>,这也可能导致在非 Windows 环境下出现问题。建议您使用标准的 C/C++ 头文件来替代它们,例如 <stdio.h><unistd.h>

总之,不同编辑器中编译运行出不同结果的问题是多方面的,需要仔细检查代码的跨平台性、编译环境和依赖库的差异等因素,并相应地进行修改和调试。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-21 21:08:12 | 显示全部楼层
在不同编辑器中编译运行同一个代码出现不同结果的原因可能是由于编译器或者环境的差异导致的。

首先,代码中使用了Windows特定的库文件  <io.h> 、 <direct.h> ,这些库文件在不同的编译器中可能会有不同的实现或者不支持。因此,在不同的编辑器中,编译器可能会对这些库文件的支持情况有所不同,从而导致在不同编辑器中编译运行出现不同的结果。

其次,代码中使用了非标准的函数  _findfirst 、 _findnext 、 _findclose ,这些函数是Windows特有的文件查找函数,不是标准C库中的函数。因此,在不同的编辑器中,对于这些非标准函数的支持情况也可能不同,从而导致在不同编辑器中编译运行出现不同的结果。

另外,不同的编辑器可能使用不同的编译器和编译选项,这也可能导致在编译过程中出现差异,进而影响最终的运行结果。

为了解决这个问题,可以尝试使用标准的C库函数替换非标准的函数,例如使用  <dirent.h>  中的函数来进行文件查找。同时,尽量避免使用特定于某个操作系统的库文件,以提高代码的跨平台性。另外,建议在不同的编辑器中都进行充分的测试,确保代码在不同环境下都能正常运行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-21 21:08:51 | 显示全部楼层    本楼为最佳答案   
出现在不同编辑器中编译运行出不同结果的原因可能有以下几个可能性:

1. 编译环境不同:不同的编辑器可能使用不同的编译器或编译选项,这可能导致在某些情况下代码的行为不一致。例如,某些编译器可能对未定义的行为进行不同的处理,导致程序的输出结果不同。

2. 版本差异:不同的编辑器和编译器版本可能存在差异,这可能导致编译器对语言标准的支持程度不同,或者在实现某些特性时存在差异,从而导致代码在不同环境下的运行结果不同。

3. 路径和文件处理差异:不同的操作系统和编辑器可能对路径和文件处理有不同的方式。这可能导致代码在不同环境下找不到文件或发生其他错误。

对于您提供的代码来说,主要问题可能是路径处理的差异。代码中使用了 Windows 特定的函数 _findfirst_findnext 来遍历文件和目录,在不同的环境下可能会导致不同的结果。

为了解决这个问题,您可以考虑使用跨平台的库和函数,如 <dirent.h><sys/stat.h>,来获取文件和目录信息,并改写代码以适应不同的操作系统和编辑器。这样可以提高代码的可移植性和兼容性。

另外,您在代码中使用了一些 Windows 特定的头文件 <io.h><direct.h>,这也可能导致在非 Windows 环境下出现问题。建议您使用标准的 C/C++ 头文件来替代它们,例如 <stdio.h><unistd.h>

总之,不同编辑器中编译运行出不同结果的问题是多方面的,需要仔细检查代码的跨平台性、编译环境和依赖库的差异等因素,并相应地进行修改和调试。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-21 21:11:38 | 显示全部楼层
问题解析:

根据提供的代码,这个程序的功能是在指定路径下统计所有以.c为后缀的文件的行数,并输出总行数。

根据提供的信息,在不同的编辑器中编译和运行相同的代码会导致不同的结果。在Dev-C++编辑器中,结果为106行;而在VS Code编辑器中,结果为0行。

问题原因:

造成这个问题的原因可能是不同编辑器的默认编码方式和文件搜索方式不同。

在Dev-C++中,默认使用GBK编码读取文件,而VS Code默认使用UTF-8编码读取文件。由于编码方式不同,可能导致在某些情况下无法正确读取文件。

另外,代码中使用了_findfirst_findnext函数来搜索文件和文件夹,这些函数在不同的编译环境中的实现也可能有所差异,进一步导致结果的不同。

解决方法:

为了保证代码在不同编辑器中的可移植性,可以做以下修改:

1. 显式指定文件的编码方式,例如使用#pragma execution_character_set("utf-8")来指定UTF-8编码。
2. 使用标准的C/C++库函数来处理文件和目录的搜索,如opendirreaddir等。
3. 使用统一的编码方式保存源代码文件,在不同的编辑器中都使用相同的编码方式打开文件。

根据以上建议,下面是修改后的完整代码:
#include <stdio.h>#include <stdlib.h>#include <dirent.h>#include <string.h>#define MAX_PATH 256long total;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) {    DIR *dir;    struct dirent *ent;    char filepath[MAX_PATH];    if ((dir = opendir(path)) == NULL) {        fprintf(stderr, "Can not open the directory: %s\n", path);        return;    }    while ((ent = readdir(dir)) != NULL) {        if (ent->d_type == DT_REG && strstr(ent->d_name, ".c") != NULL) {            snprintf(filepath, sizeof(filepath), "%s/%s", path, ent->d_name);            total += countLines(filepath);        } else if (ent->d_type == DT_DIR && strcmp(ent->d_name, ".") != 0 && strcmp(ent->d_name, "..") != 0) {            snprintf(filepath, sizeof(filepath), "%s/%s", path, ent->d_name);            findAllCodes(filepath);        }    }    closedir(dir);}int main() {    char path[MAX_PATH] = ".";        printf("计算中...\n");    findAllCodes(path);    printf("目前你总共写了 %ld 行代码!\n\n", total);        system("pause");        return 0;}
请注意,代码中的改动主要包括以下几个方面:

1. 使用opendirreaddir函数代替_findfirst_findnext函数来遍历文件夹和文件。
2. 修改了文件路径的拼接方式,使用snprintf函数来保证路径的正确性。
3. 删除了不必要的头文件io.hdirect.h,因为它们是Windows特定的头文件,在标准的C/C++中没有定义。
4. 添加了#pragma execution_character_set("utf-8")指令来指定UTF-8编码。

这样修改后的代码应该可以在不同编辑器中编译和运行得到一致的结果。根据提供的信息,计算结果应该是106行。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-8-21 21:28:50 | 显示全部楼层
学习编程中的Ben 发表于 2023-8-21 21:11
问题解析:

根据提供的代码,这个程序的功能是在指定路径下统计所有以.c为后缀的文件的行数,并输出总行数 ...

不行,您改完的代码编辑器Dev-C++ 5.11显示41行代码
        if (ent->d_type == DT_REG && strstr(ent->d_name, ".c") != NULL) {
有误无法编译
而编辑器vscode编译运行完后的结果依然为0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 08:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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