如果字符相同,则返回C.

时间:2017-09-11 17:33:42

标签: c

所以,我只是在学习如何使用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应检查字符是否是字母字符,但在这种情况下是否有更适合我使用的东西?谢谢你能给我的任何帮助!

1 个答案:

答案 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来使代码可读且健壮。