pta 分词并显示

程序的功能是:调用Input函数读入最多80个字符,要求字符串中只保留字母和空格,遇到读满或者回车结束读入字符,空格用于分隔单词。请将字符串中用空格分隔的单词在屏幕上输出来。
要求用指针完成函数中各参数的传递与访问,自定义函数头和函数体中不得出现数组下标形式的表示法。

函数接口定义:

void Input ( char *str ); int Split_Count ( char *str,char **pStr );

裁判测试程序样例:

#include <stdio.h>

/* userCode(<80字符): 自定义函数之原型声明 */

void Input ( char *str );

int Split_Count ( char *str,char **pStr );

int main(void)

{ char String[81]={0},

*pString[45];

int i=0, count;

Input(String);

count = Split_Count(String, pString);

printf("%d Words: ", count);

for (i=0; i<count-1; i++)

{ printf("%s-", pString[i]); }

printf("%s", pString[count-1]);

putchar('\n');

return 0; }

/* 请在这里填写答案 */

输入样例:

Actions speak  louder than  words

输出样例:

5 Words: Actions-speak-louder-than-words

输入样例:

12A good && beginning is half  @done  

输出样例:

6 Words: A-good-beginning-is-half-done

我的代码: 

由于涉及二重指针且题目规定不能使用下标的方法,只能通过指针移动来做,我花了接近三个小时来画图和调试Split_Count。(菜鸟罢了)。终于,在我不懈的努力下成功了。

首先我画一个图来说明这里的二重指针。(用电脑画图直接画的,有点丑。。)

因为主函数的String(字符数组首地址), pString(指针数组首地址)都通过参数传递过来了,所以str和pStr就已经可以看作和他们完全“相同”了。(实际上不同,String是一个常量,不可以加减,只能通过String[i]来进行取值,而str是一个指针变量,里面存放的应该只有一个元素的地址,而不是图上指针数组形式,通过指针的移动,使它指向不同元素的地址,通过*str或者str[i]来取值,图1只是为了方便理解才这样画,实际str的情况应该是图2,pStr的实际情况同理,如图3)

可能说的有点绕,不知道说清楚没,不清楚的可以问我,也欢迎各位指正。

 

 

int Split_Count ( char *str,char **pStr )//pstr里存放的是字符串首地址 *pstr 
{
    int count=0;//记录单词个数
  
    while(*str!='\0')
    {
    	int flag=0;
    	char *str1=str;//记录一个单词字符串的首地址
        while(*str!=' '&&*str!='\0')//后半句是为了避免:读到最后一个单词没有空格的情况下无法结束循环
        {
        	str++;
        	flag=1;
		}//直到读到空格才停止 也就是此时的*str=' '
		
		if(flag==1)
		{
			count++;
			*str='\0';//一个单词字符串一定要用'\0'来结尾,' '替换为'\0'
			*pStr=str1;//此时指针数组里存放此单词字符串首地址
			pStr++;//指针移动
		}
		str++;//多个空格同样适用
        
    }
     return count;
}
void Input ( char *str )
{
    int i=0;
    
    char ch;
    scanf("%c",&ch);

    while(ch!='\n'&&i<80)
    {
        if( (ch>='a'&&ch<='z')||  (ch>='A'&&ch<='Z') || ch==' ')
        {
            *str=ch;
            str++;
            i++; 
        }
      scanf("%c",&ch);
    }
   
    
     *(str+1)='\0';//注意 当程序终止时是因为判断ch字符不符合要求 此时的ch并没有赋值给*str 说明此时的 *str是符合要求的 所以休止符应该给*(str+i)
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值