首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

剔除文本中的空格和回车

2012-12-19 
删除文本中的空格和回车/* THE PROGRAM IS MADE BY PYY *//*----------------------------------------//C

删除文本中的空格和回车

/* THE PROGRAM IS MADE BY PYY *//*----------------------------------------//    Copyright (c) 2011 panyanyany All rights reserved.    URL   : http://acm.hdu.edu.cn/showproblem.php?pid=1277    Name  : hdu  1277 ( 全文检索 )    Date  :     Time Stage :    Result:Test Data:Review:此程序为将记事本中的空格,回车,制表符删除。1.  记事本中 ANSI 编码和 UINCODE 并存。比如,有两种空格模式,遇到 ' ' 时,是ANSI的空格模式,遇到 ' ' 时,是中文空格模式,上一种也叫做半角模式,下一种也叫做全角模式。  而对于 '\t' 和 '\n' 则无此区分。  因此需要在判断的时候加入全角空格的判断,其值为 -95,不过,会出现这样的情况,比如在一句话的结尾,往往有这样的符号 '!”' (单引号内的为两个连续的中文符号), 全角的 '!' 低字节和 全角的 '”' 高字节均为 -95,即那两个连续中文字符的内存编码为: -93,-95,-95,-97, 若在写程序的时候,一味地根据 -95 的特征来判断,则会出现把中间那两个字节删除的情况,剩下的两个字节将组成新的全角字符 '1'。  因此,为了避免这种情况的发生,我想出的方法就是在遇到中文字符或全角字符的第一个字节时(此字节的值小于0且不等于-95),便紧接着读取下一个字节到输出文件中  比如,在遇到上述的'!”'两个字符时,程序先遇到了-93,则判断其为中文或全角字符,于是紧接着将-95也输出到文件中。如此一来便不会出现如上所述的误判的情况了。2.  还有一个问题是,我使用VC6.0进行编程的时候,在有 '//(2)' 标记的位置,我是先有这么句话的 t = fgetc (in) ; 然后才将 t == -95 放在判断位置。一开始我曾试着把它们整合成一句话,即:if (fgetc (in) == -95) ,但我发现这样是行不通的,程序会无法进行第二个 -95 的判断,从而使这段清除全角空格的语句失效。但是,如果改成if ((t = fgetc (in)) == -95) 则程序能正常使用。这是个很奇怪的问题,我一直无法搞明白,希望有人能指点一二,不胜感激!//----------------------------------------*/#include <stdio.h>#include <stdlib.h>#define ISSPACE(c) ((c) == '\t' || (c) == ' ' || (c) == '\n' ||  (c) == '\r')char text[100000] ;int main (){FILE *in, *out ;int i ;char c = 0, t ;in = fopen ("in.txt", "r") ;out = fopen ("out.txt", "w") ;while (!feof (in)){c = fgetc (in) ;//printf ("%d, ", c) ;if (!ISSPACE (c)){if (c == -95){//printf ("c == -95 ") ;t = fgetc (in) ;if (t == -95) // (2){//printf ("&& fgetc == %d \n", t) ;continue ;}fseek (in, -1, SEEK_CUR) ;//printf ("fgetc != -95\n") ;}//printf ("%d", c) ;fputc (c, out) ;if (c < 0)// 将中文字符或全角字符的第二个字节也一并输出到文件中fputc (fgetc (in), out) ;}//system ("pause") ;}fclose (in) ;fclose (out) ;return 0 ;}

热点排行