所以,我只是在学习如何使用C编码,而我对老师的要求感到有些困惑。基本上,我们需要创建一个程序,逐个字符地从两个单独的文件中读取字符,如果两个字符完全相同,则打印到第三个文件。通常情况下,我会使用数组来执行此操作,但我们已经特别告知我们不允许使用数组。我有点工作,它将字符打印到第三个文件,但它除了字符之外还打印数字和标点符号。显然,我错过了一些东西,但我不知道它是什么。这是我的代码:
int main(int argc, char *argv[]) {
FILE *fp, *fp2, *ofp;
char a, b;
fp = fopen("input1a.txt", "r");
fp2 = fopen("input1b.txt", "r");
ofp = fopen("output.txt", "w");
while((a=getc(fp))!= -1){
b=getc(fp2);
if(isalpha(a) == isalpha(b)){
putc(a, ofp);
letters++;
}
}
return 0;
}
根据我的阅读,isalpha应检查字符是否是字母字符,但在这种情况下是否有更适合我使用的东西?谢谢你能给我的任何帮助!
答案 0 :(得分:6)
这是问题
if(isalpha(a) == isalpha(b)) {
它可能是
if (isalpha(a) && isalpha(b) && a == b)
你不是在比较字符是否相等,而是你要比较两者是否是字母,如果它们都是字母或者它们都是 NOT 字母,那么字符将被打印到文件。
此外,习惯于编写安全的代码,这些代码也很干净且可读,如下所示(请注意,有优雅的方法可以处理错误,并且您可以添加错误消息):
int main(int argc, char *argv[])
{
FILE *in[2];
FILE *out;
int chars[2]; // getc() returns `int' not `char'
int counter;
in[0] = fopen("input1a.txt", "r");
if (in[0] == NULL)
return -1;
in[1] = fopen("input1b.txt", "r");
if (in[1] == NULL) {
fclose(in[0]);
return -1;
}
output = fopen("output.txt", "w");
if (output == NULL) {
fclose(in[0]);
fclose(in[1]);
return -1;
}
counter = 0;
while (((chars[0] = getc(in[0])) != EOF) && ((chars[1] = getc(in[1])) != EOF) {
if (chars[0] == chars[1] && isalpha(chars[0])) {
putc(chars[0], out);
counter++;
}
}
// Release ALL resources, it's a good habit
fclose(inputs[0]);
fclose(inputs[1]);
fclose(output);
// Not required but a good habit too
return 0;
}
不要使用 magic 数字,EOF
通常为-1,但最好使用EOF
来使代码可读且健壮。