菜包菜上加菜 发表于 2023-9-10 16:34:05

C语言第一节课后习题运行不了

#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, target;
    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;
    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 = ".";
    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,对了好几遍找不到是哪出了问题{:10_266:} 求各位大佬帮忙解答一下,感激不尽{:10_287:}

菜包菜上加菜 发表于 2023-9-10 19:53:46

改完之后还是显示找不到指定文件是什么意思??无法启动程序{:10_284:}

陶远航 发表于 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);

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

另外,还请注意检查你的代码逻辑是否正确,确保文件路径和文件名没有问题,避免程序运行错误。
如果问题已经解决,请设置最佳答案

isdkz 发表于 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, target;
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, target;
    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;
    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 = ".";
    printf("计算中...\n");
    findAllCodes(path);
    findALLDirs(path);
    printf("目前你总共写了%ld行代码!\n\n", total);
    system("pause");
    return 0;
}

Mike_python小 发表于 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中编译通过了。

菜包菜上加菜 发表于 2023-9-10 18:52:18

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

你可以按照 ...

好的,谢谢你!!我去试试{:10_297:}
页: [1]
查看完整版本: C语言第一节课后习题运行不了