程序的功能是:调用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)
}