程序在更改字符时退出?
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
。这不是一种很好的编程风格。尝试编写一个函数并调用它。
我正在尝试制作一个程序,将 (Đ,Š,Č,Ć 和 Ž) 塞尔维亚(拉丁)字符转换为 (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
。这不是一种很好的编程风格。尝试编写一个函数并调用它。