初级之单词前数后数及综合

在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[个数],这是指针数组了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值