我正在尝试制作一个程序,将(Đ,Š,Č,Ć和Ž)塞尔维亚语(拉丁语)字符转换为(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)
编译:
Tiny C编译器(x64)
答案 0 :(得分:1)
您被操作员优先级咬伤了:
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)
<小时/> 另一个问题 - 您正在尝试修改输入文件&#34;到位&#34; - 这通常是一个坏主意(任何错误通常意味着你留下了一个损坏的原始文件)。此外,代码当前编写的方式不会做你想要的(正如你所看到的)。更好的方法是将输出写入新文件,然后成功完成后,您可以删除旧文件并重命名新文件。
goto
答案 1 :(得分:0)
两件事。
第1点。根据C
operator precedence,在您的代码中
if(c = fgetc(filepointer) != EOF)`
转换为
if ( c = (fgetc(filepointer) != EOF) )`
这不是你想要的。您应该将其更改为
if((c = fgetc(filepointer)) != EOF)`
第2点。
if(er = EOF)
=
是分配运营商。要比较值,您需要使用eqality运算符==
。你的代码应该是
if(er == EOF)
注意:如果可能,请避免goto
。这不是一个很好的编程风格。尝试编写一个函数并调用它。