程序在更改字符时退出?

Program quits while changing characters?

我正在尝试制作一个程序,将 (Đ,Š,Č,Ć 和 Ž) 塞尔维亚(拉丁)字符转换为 (D,S,C,C,Z),这样我的电视就可以识别它们了。
不,这不是编码错误,是的,我的电视是 运行 最新的软件。
所以我决定制作这个转换字符的命令程序
问题是目标文件保持不变,并在出现此消息后退出:

Počinje konvertovanje.

为什么会这样? 来源:

#include <stdio.h>
#include <stdlib.h>
char c;
char filename[256];
int er;
int main()
{
    printf("\nUnesi podatak za prevoðenje:");
    scanf("%s",&filename);
    FILE* filepointer;
    filepointer = fopen(filename,"r+");
    if(filepointer == NULL){
        fclose(filepointer);
        printf("\nGREŠKA: Nije moguæe otvoriti podatak!");
    }else{
        printf("\nUspješno otvoren podatak.");
        printf("\nPoèinje konvertovanje.");
        proccess:
        if(c = fgetc(filepointer) != EOF){
            if(c == 0x9A){  // ZA Š
                c = 0x73;
                er = fputc( c , filepointer );
                if(er = EOF)
                    goto error;
            }else if(c == 0xF0){ //ZA Đ
                c = 0x64;
                er = fputc( c , filepointer );
                if(er = EOF)
                    goto error;
            }else if(c == 0x9E){
                c = 0x7A;
                er = fputc( c , filepointer );
                if(er = EOF)
                    goto error;
            }else if(c == 0xE8){
                c = 0x63;
                er = fputc( c , filepointer );
                if(er = EOF)
                    goto error;
            }else if(c == 0xE6){
                c = 0x63;
                er = fputc( c , filepointer );
                if(er = EOF)
                    goto error;
            }
            goto proccess;
        }
        if((c = fgetc(filepointer) ) != EOF){
            printf("Prijavljen EOF: Podatak se završava!");
            exit(0);
        }
    }
    return 0;
    error:
        printf("\nPrijavljen neoèekivani EOF,");
        printf("\nvjerovatno je neka greška!");
        return 1;
}

平台: Windows 7 家庭高级版 (x64)
编译器: 微型 C 编译器 (x64)

您遇到了运算符优先级问题:

if(c = fgetc(filepointer) != EOF)

应该是:

if((c = fgetc(filepointer)) != EOF)

请注意,如果您在编译时启用了警告(例如 gcc -Wall ...),编译器会很有帮助地指出这个错误:

main.c:19:41: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
         if(c = fgetc(filepointer) != EOF){

您还会收到另一个错误的警告:

main.c:23:28: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
                 if(er = EOF)

这一行当然应该是:

                 if(er == EOF)


另一个问题——你试图修改输入文件 "in place"——这通常是个坏主意(任何错误通常意味着你留下了损坏的原始文件)。此外,当前编写代码的方式不会执行您想要的操作(如您所见)。更好的方法是将输出写入新文件,然后在成功完成后删除旧文件并重命名新文件。
作为奖励,一些关于编程风格的建议:

  • 避免全局变量
  • 不要使用 goto

两件事。

点 1. 根据 C operator precedence,在您的代码中

if(c = fgetc(filepointer) != EOF)` 

翻译成

if ( c =  (fgetc(filepointer) != EOF) )`

这不是你想要的。你应该把它改成

if((c = fgetc(filepointer)) != EOF)`

点 2.

 if(er = EOF)

= 是赋值运算符。要比较 值,您需要使用相等运算符==。您的代码应该是

if(er == EOF)

注意:如果可能,请避免goto。这不是一种很好的编程风格。尝试编写一个函数并调用它。