函数接口定义:
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
题目作者:成信大余老师
//输入函数判断
void Input ( char *str )
{
char ch = '0';
int i = 0;
while (i < 80 && scanf("%c", &ch) && ch != '\n' )
{
//如果是字母或者空格就记录如果不是就跳过
if ((ch >= 'a' && ch <= 'z') || (ch <= 'Z' && ch>='A') || ch == ' ')//可以使用库函数来判断
{
*str++ = ch;
i++;
}
}
//最后别忘存储\0
*str = '\0';
}
//在指针数组里存储每个字母首地址,在空格处改成\0,然后下一个字母开始字符被下一个指针数组元素记录,依次类推,此处要注意几种情况1.开始时有空格。2.两个单词间有两个空格。3.末尾有空格
int Split_Count ( char *str,char **pStr )
{
int flag = -1,count=0,f=0;
char* ret = str;
char* ret1 = str;
int i = 0;
while (*ret++)
{
i++;
}
while (*str != '\0')
{
if (*str != ' '&&flag==-1&&f==0)
{
*pStr++ = str;
flag = 0;
f = 1;
}
//char ch = *(str-1);
if (*str == ' '&&f==1&&flag==0 )
{
f = 0;
flag = -1;
*str = '\0';
count++;
}
str++;
}
if (*(ret1 + i - 1) == ' ')
{
return count;
}
else
{
return count+1;
}
}
1.对于第一个的解决方案是定义一个判断变量flag,先判断有一个字母后吃能进入空格判断
2.对于第二个的解决方案是定义一个判断变量f,当前一个是字母时,才会让这个空格被记录为有效空格
3.对于第三个的解决方案,就比较愚钝,我是遍历一遍然后判断最后一个字符是不是空格,如果是空格,那返回的值就要返回实际空格值,否则返回空格值加1,因为单词数等于空格数加1
如果对于末尾空格有更好的解决方案,求告知,谢谢
emmm还有一种投机取巧的方法使用库函数strtok
#include<string.h>
void Input ( char *str )
{
char ch = '0';
int i = 0;
while (i < 80 && scanf("%c", &ch) && ch != '\n' )
{
if ((ch >= 'a' && ch <= 'z') || (ch <= 'Z' && ch>='A') || ch == ' ')
{
*str++ = ch;
i++;
}
}
*str = '\0';
}
int Split_Count ( char *str,char **pStr )
{
int count=0;
char a[]=" ";
for(char* ret=strtok(str,a);ret!=NULL;ret=strtok(NULL,a))
{
*pStr++=ret;
count++;
}
return count;
}