- 论坛徽章:
- 0
|
ec注释含半个汉字的编译问题
目前的处理方法是用一个程序删除程序中的半个汉字:
前提————认为汉字是由两个字节区码和位码组成的,并认为区码和位码都大于128(或者160更确切?但有例外如“镕”的区码为233位码却为70);
处理————统计每一段连续的汉字代码(区码和位码)的个数,如果结果为奇数就把最后一个字节删除。
隐患————会误删除如“镕”之类的字串,担心还有会其他未意识到的问题
程序代码如下,请各位大侠帮看看有没有什么问题:
- #include <stdio.h>;
- #include <stdlib.h>;
- main(int argc, char *argv[])
- {
- FILE *fp_in, *fp_out;
- char fname_in[256], fname_out[256];
- char str[1024+1];
- char chi[1024+1];
- char *p;
- int i, j, begin_flag, modify_flag;
- char cmd_str[1024+1];
- if( 2 != argc)
- {
- printf("\n\tUsage: %s <filename>;\n\n", argv[0]);
- exit(1);
- }
- modify_flag=0;
- memset(fname_in, 0, sizeof(fname_in));
- memset(fname_out, 0, sizeof(fname_out));
- memset(str, 0, sizeof(str));
- memset(chi, 0, sizeof(chi));
- memset(cmd_str, 0, sizeof(cmd_str));
-
- strcpy(fname_in, argv[1]);
- sprintf(fname_out, "%s.kill_half", argv[1]);
-
- printf("in_file: %s\nout_file: %s\n", fname_in, fname_out);
-
- if((fp_in=fopen(fname_in, "r"))==NULL){
- printf("fopen %s err!\n", fname_in);
- exit(1);
- }
- if((fp_out=fopen(fname_out, "w"))==NULL){
- printf("fopen %s err!\n", fname_out);
- exit(1);
- }
- while(fgets(str, 1024, fp_in)!=NULL)
- {
- p=chi;
- for(i=0, j=0, begin_flag=0; i<strlen(str); i++)
- {
- if(str[i]>;128)
- {
- begin_flag=1;
- j++;
- *p++=str[i];
- }
- else
- {
- if(1==begin_flag && 0!=j%2)
- {
- p--;
- *p=str[i];
- p++;
- modify_flag=1;
- }
- else *p++=str[i];
- j=0;
- begin_flag=0;
- }
- }
- *p='\0';
- fputs(chi, fp_out);
- }
- fclose(fp_in);
- fclose(fp_out);
- if(1==modify_flag)
- {
- sprintf(cmd_str, "cp %s %s.half_bak; mv %s.kill_half %s",
- argv[1], argv[1], argv[1], argv[1]);
- printf("cmd_str1: %s\n\n", cmd_str);
- system(cmd_str);
- }
- else
- {
- sprintf(cmd_str, "rm -f %s.kill_half", argv[1]);
- printf("cmd_str2: %s\n\n", cmd_str);
- system(cmd_str);
- }
- }
复制代码 |
|