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:}
改完之后还是显示找不到指定文件是什么意思??无法启动程序{:10_284:} 报错信息显示,你使用的是不安全的函数。在最新的编译器中,某些函数被认为是不安全的,并建议使用替代函数以提高代码的安全性。
以下是替代函数的建议:
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);
你需要将这些函数替换为建议的安全函数,以解决报错问题。同时,确保你的编译器已经禁用了相关的警告。
另外,还请注意检查你的代码逻辑是否正确,确保文件路径和文件名没有问题,避免程序运行错误。
如果问题已经解决,请设置最佳答案 这些错误信息都是因为使用了不安全的函数,可以按照错误信息中给出的建议,使用对应的安全函数,或者在代码开头加上#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;
}
这些错误是由于使用了不安全的函数而导致的。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中编译通过了。 Mike_python小 发表于 2023-9-10 16:47
这些错误是由于使用了不安全的函数而导致的。Visual Studio 2019建议使用更安全的替代函数。
你可以按照 ...
好的,谢谢你!!我去试试{:10_297:}
页:
[1]