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

题目作者:成信大余老师

//输入函数判断


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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1886i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值