C语言编程题-“i love china“按单词逆序输出

编程题目:

给定一个字符串“I love china”,编写程序完成以单词为单位的逆序,如“china love i”,并要求不允许使用第三方变量保存数据,但可以使用辅助指针变量等。


思路及程序编写

思路一

首先将字符串整体倒置:“anihc evol i”
然后再次遍历字符串,将每个单词倒置:“china love i”

程序如下:

#include <stdio.h>

void swapstr(char *head ,char *tail);

int main(int argc, const char *argv[])
{
	char str[] = "I love china";
	char *head = str, *tail = str;
    	
	puts(str);
    //先将尾指针定位到字符串尾部
	while(*tail != '\0')
	tail ++;
    //将整个字符串倒置
	swapstr(str, tail - 1);
    //主函数开始扫描遍历整个倒置后的字符串
	while(*head != '\0')
	{
        //查找单词头		
		while(*head == 32)   //32是空格
		head++;
		//找到头后将尾定位到头,开始找单词尾
		tail = head;
		while(*tail != 32 && *tail != '\0')
		tail++;
		//前两步找到头之后将单词倒置(因为循环结束后tail指向'\0',所以tail-1)
		swapstr(head,tail - 1);
		//单词倒置后将头指向尾,为下次找单词做准备
		head = tail;
		
	}
	puts(str);
	return 0;
}

//完成指定字符串倒置
void swapstr(char *head, char *tail)
{
	char temp = 0;
	while(head < tail)
	{
		temp = *head;
		*head = *tail;
		*tail = temp;
		head++;
		tail--;
	}
}

思路二

(这种思路是为了引出strtok函数和指针数组结合用法,可能不满足题目要求,但结果一致。)
首先使用strtok函数进行字符串分割(strtok函数用法可以百度)
然后定义一个指针数组,把分割后的字符串逐个存入指针数组(指针数组概念必须知道)
然后将这个指针数组内的多个字符串用strcat函数进行逆序连接

程序如下:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
	char str[] = "i love china";
	char *p_arr[3] = {NULL,NULL,NULL};
	char arr[100] = {0};
	char *p = NULL;
	int i = 0;
	p = strtok(str," ");//获取第一个字符串
	while(p != NULL)  //继续获取其他字符串 直至检测不到字符串返回空指针
	{
		printf("%s ",p);	//打印信息,用于调试
		p_arr[i] = p;		//将获取到的字符串存入指针数组
		i++;
		p = strtok(NULL," ");   //获取下一个字符串
	}
	putchar('\n');
	for(i = 0;i < 3;i++)
	{
		printf("%s ",p_arr[i]);   //打印调试信息
	}
	putchar('\n');
	for(i = 2; i >= 0;i--)     //倒序
	{
		printf("%s ",p_arr[i]);  //打印调试信息
		strcat(arr,p_arr[i]);    //3个字符串倒着连接
		strcat(arr," ");
	}
	putchar('\n');
	puts(arr);					//输出结果
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值