这是我的第一个问题,所以我希望你们能提供帮助。在课堂上,我的任务是编写一个C代码,从1个文件中读取一组字符串,然后将它们打印在另一个文件中,以及字符串中每个字符的ASCII代码,以及ASCII代码值的总和。下面的代码已编译,但未执行。代码是对的,但是我做错了,或者代码是错的。非常感谢。
注意:第一个文件从名为list的文本文件中读取,代码打印到名为list2的文本文档中。
#include <stdio.h>
int main(void)
{
FILE *file1, *file2;
file1 = fopen("list.txt", "r");
if (file1==NULL)
{
puts(" File not exisiting\n");
}
file2 = fopen("list2.txt", "w");
if (file2==NULL)
{
puts(" File could not open \n");
}
char a[5];
fscanf(file1, "%s", a);
int b,c;
while (a[5]!=EOF)
{
for (int i=0;i<5;i++)
{
fprintf(file2, "%c", a[i]);
b=a[i];
fprintf(file2, "%d", b);
c+=b;
}
}
fprintf(file2, "%d", c);
return 0;
}
答案 0 :(得分:2)
第1点。使用
之类的定义char a[5];
使用
while (a[5]!=EOF)
调用undefined behaviour。
你面临着一个一个错误。请记住,c中的数组索引从0开始。有效访问最多为a[4]
。
第2点。 fscanf(file1, "%s", a);
不安全。它可能导致缓冲区溢出。至少,你需要写
if ( fscanf(file1, "%4s", a) != 1)
{
//scanning not successful, take necessary measures
}
//otherwise, continue nomal execution.
第3点。 while
循环的逻辑不正确。那里没有break
条件。
第4点。 c+=b;
,此处c
未经初始化使用。 read-before-write 方案。再次,undefined behaviour。请记住,auto
局部变量不会自动初始化为0
或某个值。你必须明确初始化。
第5点。如果if (file1==NULL)
条件满足,则不要继续正常执行。仅打印消息是不够的。您应该停止使用该计划,并避免使用file1
,file1
等。
第5点的信用:user4402433
答案 1 :(得分:0)
将return
包含在文件检查中
if (file1==NULL)
{
puts(" File not exisiting\n");
return 0;
}
因为如果打开任何一个文件,就不会继续使用代码。
同时在while之前初始化c=0;
的值,以便可以避免任何垃圾值。
必须对数组a[]
编制索引以更新文件内容。所以放置
fscanf(file1, "%s", a[i]);
在for()
循环内。这是为了避免在极少数情况下发生缓冲区溢出。