在c语言中有时要统计单词(或字符串,下面以单词称之)的个数或者记录下字符串,本文就是总结一下这个的问题的方法。
1:寻找规律 abc_abc abc_abc_ _abc_abc __abc__abc__abc 首先是计单词个数,由有上面我们发现单词的产生的标志可以有两种,一种是_abc,另一种是abc_,这也就是题目中说的前数和后数法。 先说前数法 ,_abc。就是说如果当前的字符不是空格,而前一字符是空格,那么新单词就产生了,开始计数,直到结束。为此写程序时引入一个标志位,标志上一个字符的属性即可。程序如下: int wcount(char *s) { int wstart=0,wcount=0;//标志位和单词计数
char c;
while((c=*(s++))!='\0')
{ if(c==' ')//出现空格,单词还没有开始
{
wstart=0;
}
else if(wstart==0)//如果前面一个字符的标志是单词还没有开始,而当前的又不是空格,则根据规律可得::单词产生了!
{
wstart=1;
wcount++;
}
} return wcount; } 再说后数法,abc_。就是说如果当前的是空格,而前一字符不是空格,那么新单词也产生了。呵呵,也许你已经发现如果在句子最后我没有加多一个空格的话,那么就无法判断了?是的所以应该加多一个判断条件那就是或者如果[下一个]字符的是数组结束符,而前一字符不是空格,那么新单词也产生了。同样程序也引入一个标志位。
int wcount(char *s)
{
int inword=0,wcount=0;
char c;
while((c=*(s++))!='\0')
{
if( ( (c==' ') || (*s=='\0') ) && (inword==1) )//如果当前是空格或下一个字符是结束符,而且前一个字符不是空格,新单词产生
{
inword=0;
wcount++;
}
else
{
inword=1;
}
}
return wcount; } 最后两者结合就可以用来计算单词和记录单词了,即前数法开始记录,后数法结束记录 ,任一种方法计算单词。
void wcnr(char *ps,char (*psp)[20])
{
char inword=0,oflg=0,c;
char str[20],*pstr=str;
int wnum=0;
while((c=*ps)!='\0')
{
if(c==' ')//连续为空格执行空操作
{
if(inword==1)
{
oflg=1;//over flag结束标志位置一
}
inword=0;
}
else
{
if(inword==0)
{
wnum++;
}
inword=1;
*pstr++=c;
}
ps+
if(*ps=='\0')
{
oflg=1;
}
if(oflg)
{
*pstr='\0';//结束字符串
pstr=str;//重置指针
strcpy(*psp++,str);//将每一个字符串输出到另一个二位数组中储存
printf("%d",wnum);
puts(str);
oflg=0;//复位标志
}
}
}
心得: 写一个程序关键在于发现问题的规律和程序对象的各种情况 ,要仔细分析每种情况的关系,合理利用关系结合常用结构语句就可达到简化程序的作用,例如利用if来执行空操作。 不要小看每一个程序,积累简单的小程序。 数组名是常量,不可进行运算,二维数组指针*(a+1)+2类似的则可但并未改变a(二维数组名)。 二维数组指针(*p)[每一行的个数]注意[]的运算级比*要高所以要加(),不加则为*p[个数],这是指针数组了。 |
初级之单词前数后数及综合
最新推荐文章于 2024-06-27 00:00:00 发布