字符串倒序

1.题目

输入字符串,字符串包含字母(大小写)、数字和其他符号;

要求:只输出字母;

          单词并不倒叙;

           遇到其他符号输出空格,多个非字母符号相邻只输出一个空格;

示例:

         输入:I am student.

         输出:student am i

         输入:iasda123ASDSas123 01  01asd

         输出:iasda ASDSas asd

2.思路详解 

此题我们需要从后往前进行遍历,

设置两个变量:start、end,  start用于记录字母的开头,end用于记录字母的结尾。

同时我们我们需要两个关键符号:flag、key, flag用于记录这个字母是否连续,key用于记录其它符号是否连续。

 3.代码

将字符串倒叙,但字母不倒叙,其他输出为‘ ’,空格不能连续 · 53fe99b · 风夏/C语言进阶 - Gitee.com

#define  _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{ 
    char arr[10001] = { "\0" };
    int i = 0;
    int j = 0;
    while (1)
    {
        char tmp = '0';
        scanf("%c", &tmp);
        if (tmp == '\n')
            break;
        arr[i] = tmp;
        i++;
    }
    int len = strlen(arr);
    int end = 0;
    int start = 0;
    //key是1表示非字母连续,0不连续
    int key = 0;
    //flag是1表示字母连续,0不是不连续
    int flag = 0;
    for (i = len-1; i >= 0; i--)
    {
        //是字母,
        if ( isalpha(arr[i]))
        {
            //第一个字母
            if (flag == 0)
            {
                end = i;
                flag = 1;
                key = 0;
            }
            else//连续的字母,往后循环
                ;
        }
        else//不是字母
        {
            if (flag)//前面是字母
            {
                start = i + 1;
                for (j = start; j <= end; j++)
                {
                    printf("%c", arr[j]);
                }
            }
            //字母连续标记清0
            flag = 0;
            //第一个非字母元素
            if (key == 0)
            {
                printf(" ");
                key = 1;
            }
        }
        //特殊情况考虑:输出最后是字母,但没有结束标志(没有非字母元素)
        if (flag == 1 && i == 0)
        {
            start = 0;
            for (j = 0; j <= end; j++)
                printf("%c", arr[j]);
        }
        
    }
    return 0;
     
}

4.总结

在真正自己写的时候才能发现里面有哪些需要注意的。

希望大家越学越好。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值