字符删除的问题
现有一英文文章
已经按行读去到数组xx[50][80]中
变量maxline记录了文章的行数
文章的格式如下:
文章只有单词,空格和标点符号组成,每个单词长度不超过20,每行不超过80个字符
现要求删除文章的空格和标点及长度为奇数的单词,其余的仍然按行存储
以下是删除的函数 Delword()
不知道那里出问题了 ,系统提示删除后的文件不正确
void DelWord(void)
{ char newxx[80]= " ",word[20]= " ";
int i,j=0,wl=0;
for(i=0;i <maxline;i++)
{ while(xx[i][j]!=0)
{ if(isalpha(xx[i][j]))word[wl++]=xx[i][j];
else
{ if(wl%2==0)strcat(newxx,word);
for(wl=0;wl <strlen(word);wl++)word[wl]=0;
wl=0;
}
j++;
}
if(isalpha(xx[i][--j]))
{ if(wl%2==0)strcat(newxx,word);
for(wl=0;wl <strlen(word);wl++)word[wl]=0;
wl=0;
}
strcpy(xx[i],newxx);
for(wl=0;wl <80;wl++)newxx[wl]=0;
wl=0;
}
}
----以下是全部代码,但除了 delword函数,其他的函数肯定正确
只要知道maxline记录了行数,xx[50][80]是全局数组即可
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
char xx[50][80] ;
int maxline = 0 ; /* 文章的总行数 */
int ReadDat(void) ;
void WriteDat(void) ;
void DelWord(void)
{ char newxx[80]= " ",word[20]= " ";
int i,j=0,wl=0;
for(i=0;i <maxline;i++)
{ while(xx[i][j]!=0)
{ if(isalpha(xx[i][j]))word[wl++]=xx[i][j];
else
{ if(wl%2==0)strcat(newxx,word);
for(wl=0;wl <strlen(word);wl++)word[wl]=0;
wl=0;
}
j++;
}
if(isalpha(xx[i][--j]))
{ if(wl%2==0)strcat(newxx,word);
for(wl=0;wl <strlen(word);wl++)word[wl]=0;
wl=0;
}
strcpy(xx[i],newxx);
for(wl=0;wl <80;wl++)newxx[wl]=0;
wl=0;
}
}
void main()
{
clrscr() ;
if(ReadDat()) {
printf( "数据文件ENG.IN不能打开!\n\007 ") ;
return ;
}
DelWord() ;
WriteDat() ;
}
int ReadDat(void)
{
FILE *fp ;
int i = 0 ;
char *p ;
if((fp = fopen( "eng.in ", "r ")) == NULL) return 1 ;
while(fgets(xx[i], 80, fp) != NULL) {
p = strchr(xx[i], '\n ') ;
if(p) xx[i][p - xx[i]] = 0 ;
i++ ;
}
maxline = i ;
fclose(fp) ;
return 0 ;
}
void WriteDat(void)
{
FILE *fp ;
int i ;
fp = fopen( "ps8.out ", "w ") ;
for(i = 0 ; i < maxline ; i++) {
printf( "%s\n ", xx[i]) ;
fprintf(fp, "%s\n ", xx[i]) ;
}
fclose(fp) ;
}
[解决办法]
if(isalpha(xx[i][--j]))
{
if(wl%2==0)strcat(newxx,word);
for(wl=0;wl <strlen(word);wl++)word[wl]=0;
wl=0;
}
这部分是干什么用的?
看着多余 ......
while 的退出条件是字符串结束,
并且wl在前一轮循环中被赋值为0,
那么必然有 wl%2==0,
那么如果 这一行的最后一个单词是 a (一个字符,长度为奇数),
在你的这个过程中, 是否也被链接上去了?
感觉这个部分就是一块鸡肋!
[解决办法]
其实是不多余的,你想想,如果这一行的格式是这样的:i was jack\0
那么就会因为遇到\0而结束循环,这时数组word其实还存有jack这个单词未处理呢
而\0 之前是不是一个字母所以用if(isalpha(xx[i][--j]))判断
--------------------------------
是不是外面while循环判断的时候用\0套一个,把你那段删了