用指针来完成“you are from shanghai”逆序

//用指针的方式来逆序,再逆序;
#include<stdio.h>
#include<string.h>

int main()
{
    char a[] = "you are from shanghai";
    char temp;
    char *p1 = a;
    char *p2 = a + strlen(a) - 1;    //找到尾指针;

//将整个字符串逆序;
    while(p1 < p2)
    {
	temp = *p1;
	*(p1++) = *p2;
	*(p2--) = temp;
    }

   // printf("%s",a);
    puts(a);
    putchar('\n');

//再进行单词的逆序,遇到一次空格的也就是找到一个单词,然后对这个单词进行逆序;
    p1 = a;
    p2 = a;//p1 p2 都指向新的a[];
    char *p3 = NULL;

    while(*p2)             //让*p2开始往后遍历空格,直到'\0';
    {
        if(*p2 == ' ')      // 判断找到空格
	{
	    p3 = p2 -1;

	    while(p1 < p3)   //循环交换单词的前后单词;
	    {
	    
	        temp = *p1;
	        *(p1++) = *p3;
	        *(p3--) = temp;
	    }
	    p1 = p2 + 1;
	}
	p2++;
    
    }

//这边当p2等于'\0'时,对'\0'前面的一个单词进行逆序;
    p3 = p2 -1;
    while(p1 < p3)
    {
        temp = *p1;
	*(p1++) = *p3;
	*(p3--) = temp;
	
    }
    puts(a);
    putchar('\n');



    return 0;
}

这个当中用了不少if():这是一个判断语句,只是执行一次

而while():这是循环语句,知道括号里的内容为假推出循环(0为假);不要混淆他们的用法!!

-----------------------------------------------------------------------------------------------------------分割线2017.07.19----------------------------------------------------------------------------------------

//使用函数处理you are from shanghai 逆序问题;
#include<stdio.h>
#include<string.h>
//void nixu(char)
void nixu(char *arr)
{
    int min = 0;
    int len = strlen(arr);
    int max = len-1;

    while(max > min)
    {
        char temp;
        temp = arr[min];
	arr[min++] = arr[max];
	arr[max--] = temp;
    
    }
}

int main()
{
    char arr[] = "you are from shanghai";
    //先整个数组完全逆序;
    nixu(arr);

    //再单词逆序

    char *p1 = arr;
    char *p2 = arr;

    while(*p2)
    {
        if(*p2 == ' ')
        { 
            *p2 = '\0';   //把空格置'\0',以便于调用的函数可以计算单词的长度len;(因为写的函数当中用到了计算单词长度的strlen,必须要有'\0')
	    nixu(p1);
	    *p2 = ' ';
	    p1 = p2+1;
	}
	p2++;
    } 

    nixu(p1);
    puts(arr);

    return 0;
}
详细说一下strlen():t=这个函数可以用来要计算字符串的实际长度,因为在写字符串的时候会默认给它后面补上'\0',所以strlen()就是找到'\0',计算'\0'之前的长度;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值