鱼C论坛

 找回密码
 立即注册
查看: 867|回复: 5

[已解决]C语言第一节课后习题运行不了

[复制链接]
发表于 2023-9-10 16:34:05 | 显示全部楼层 |阅读模式

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

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

x
#include<io.h>
#include<direct.h>
#include<stdlib.h>
#include<stdio.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;
}
报错信息:
严重性        代码        说明        项目        文件        行        禁止显示状态
错误        C4996        'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.        S1        D:\自动化学习资料库\C语言\小甲鱼课后作业\S1\S1\源.c        17       
错误        C4996        'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.        S1        D:\自动化学习资料库\C语言\小甲鱼课后作业\S1\S1\源.c        37       
错误        C4996        'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.        S1        D:\自动化学习资料库\C语言\小甲鱼课后作业\S1\S1\源.c        38       
错误        C4996        'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.        S1        D:\自动化学习资料库\C语言\小甲鱼课后作业\S1\S1\源.c        42       
错误        C4996        'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.        S1        D:\自动化学习资料库\C语言\小甲鱼课后作业\S1\S1\源.c        54       
错误        C4996        'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.        S1        D:\自动化学习资料库\C语言\小甲鱼课后作业\S1\S1\源.c        55       
错误        C4996        'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.        S1        D:\自动化学习资料库\C语言\小甲鱼课后作业\S1\S1\源.c        66       

我用的软件是Visual Studio2019,对了好几遍找不到是哪出了问题 求各位大佬帮忙解答一下,感激不尽
最佳答案
2023-9-10 16:47:29
这些错误是由于使用了不安全的函数而导致的。Visual Studio 2019建议使用更安全的替代函数。

你可以按照编译器的建议进行修改,使用更安全的函数代替。
对于`fopen`,你可以使用`fopen_s`来替代:
if (fopen_s(&fp, filename, "r") != 0)
{
    fprintf(stderr, "Can not open the file:%s\n", filename);
    return 0;
}


对于`strcpy`和`strcat`,你可以使用`strcpy_s`和`strcat_s`来替代:
strcpy_s(thePath, MAX, path);
strcat_s(thePath, MAX, "/*.c");
对于`sprintf`,你可以使用`sprintf_s`来替代:
sprintf_s(target, MAX, "%s/%s", path, fa.name);

这样修改后,你的代码应该可以在Visual Studio 2019中编译通过了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-9-10 19:53:46 | 显示全部楼层
改完之后还是显示找不到指定文件是什么意思??无法启动程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-10 16:34:20 | 显示全部楼层
报错信息显示,你使用的是不安全的函数。在最新的编译器中,某些函数被认为是不安全的,并建议使用替代函数以提高代码的安全性。

以下是替代函数的建议:

1. 将fopen替换为fopen_s函数。
   例如:if ((fopen_s(&fp, filename, "r")) != 0)

2. 将strcpy替换为strcpy_s函数。
   例如:strcpy_s(thePath, sizeof(thePath), path);

3. 将strcat替换为strcat_s函数。
   例如:strcat_s(thePath, sizeof(thePath), "/*.c");

4. 将sprintf替换为sprintf_s函数。
   例如:sprintf_s(target, sizeof(target), "%s/%s", path, fa.name);

你需要将这些函数替换为建议的安全函数,以解决报错问题。同时,确保你的编译器已经禁用了相关的警告。

另外,还请注意检查你的代码逻辑是否正确,确保文件路径和文件名没有问题,避免程序运行错误。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-10 16:34:24 | 显示全部楼层
这些错误信息都是因为使用了不安全的函数,可以按照错误信息中给出的建议,使用对应的安全函数,或者在代码开头加上#pragma warning(disable:4996)来禁用这些警告。具体修改如下:

1. 将fopen改为fopen_s,修改后的代码如下:
FILE* fp;
int count = 0;
int temp;
if (fopen_s(&fp, filename, "r") != 0)
{
    fprintf(stderr, "Can not open the file:%s\n", filename);
    return 0;
}

2. 将strcpy改为strcpy_s,修改后的代码如下:
char thePath[MAX], target[MAX];
strcpy_s(thePath, MAX, path);

3. 将strcat改为strcat_s,修改后的代码如下:
if ((handle = _findfirst(strcat_s(thePath, MAX, "/*.c"), &fa)) != -1L)

4. 将sprintf改为sprintf_s,修改后的代码如下:
sprintf_s(target, MAX, "%s/%s", path, fa.name);

另外,建议在使用_findfirst函数前先判断路径是否存在,可以使用_access函数来判断,修改后的代码如下:
if (_access(path, 0) == -1)
{
    fprintf(stderr, "The path %s does not exist!\n", path);
    return 0;
}

修改后的完整代码如下:
#include<io.h>
#include<direct.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.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 (fopen_s(&fp, filename, "r") != 0)
    {
        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];
    if (_access(path, 0) == -1)
    {
        fprintf(stderr, "The path %s does not exist!\n", path);
        return;
    }
    strcpy_s(thePath, MAX, path);
    if ((handle = _findfirst(strcat_s(thePath, MAX, "/*.c"), &fa)) != -1L)
    {
        do
        {
            sprintf_s(target, MAX, "%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];
    if (_access(path, 0) == -1)
    {
        fprintf(stderr, "The path %s does not exist!\n", path);
        return;
    }
    strcpy_s(thePath, MAX, path);
    if ((handle = _findfirst(strcat_s(thePath, MAX, "/*"), &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_s(thePath, MAX, "%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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-10 16:47:29 | 显示全部楼层    本楼为最佳答案   
这些错误是由于使用了不安全的函数而导致的。Visual Studio 2019建议使用更安全的替代函数。

你可以按照编译器的建议进行修改,使用更安全的函数代替。
对于`fopen`,你可以使用`fopen_s`来替代:
if (fopen_s(&fp, filename, "r") != 0)
{
    fprintf(stderr, "Can not open the file:%s\n", filename);
    return 0;
}


对于`strcpy`和`strcat`,你可以使用`strcpy_s`和`strcat_s`来替代:
strcpy_s(thePath, MAX, path);
strcat_s(thePath, MAX, "/*.c");
对于`sprintf`,你可以使用`sprintf_s`来替代:
sprintf_s(target, MAX, "%s/%s", path, fa.name);

这样修改后,你的代码应该可以在Visual Studio 2019中编译通过了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-9-10 18:52:18 | 显示全部楼层
Mike_python小 发表于 2023-9-10 16:47
这些错误是由于使用了不安全的函数而导致的。Visual Studio 2019建议使用更安全的替代函数。

你可以按照 ...

好的,谢谢你!!我去试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 13:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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