将以A开头的单词与以N结尾的单词,用头尾交换的办法予以置换。

题目:读入一行文本,包含若干个单词(以空格间隔,或文本结束)。将其中的以A开头的单词与以N结尾的单词,用头尾交换的办法予以置换。

实例:

输入:“AM I OLDER THAN YOU”

输出:“THAN I OLDER AM YOU”

算法描述:1)分别记录以A开头单词的首字符位置pre1和尾字符位置post1,以N结尾单词的首字符位置pre2和尾字符位置post2

                  2)将字符串pIn的单词赋给字符串pOut。若pIn遇到pre1将pre2-post2上的字符赋值给pOut,若遇到pre2则将pre1-post1上的字符赋值给pIn。

#include<stdio.h>
#include<stdlib.h>
void exchange(const char* pIn, char* pOut);
int main() {
	char pIn[] = "AM I OLDER THAN YOU";
	char* pOut = (char*)malloc(sizeof(pIn));
	exchange(pIn, pOut);
	printf("%s\n", pIn);
	printf("%s", pOut);
        free(pOut);
	return 0;
}
void exchange(const char* pIn, char* pOut) {
	int pre1, post1, pre2, post2;//分别记录首字符为A的单词和尾字符为N的单词
	int i = 0;
	while (pIn[i] != '\0') {
		if (pIn[i] == 'A' && (i == 0 || pIn[i - 1] == ' ')) {
			pre1 = i;
			while (pIn[i] != ' ') i++;
			post1 = i - 1;
		}//记录首字符为A的单词在字符串中的首尾索引
		if (pIn[i] == 'N' && (pIn[i + 1] == ' ' || pIn[i + 1] == '\0')) {
			post2 = i;
			while (pIn[i] != ' ') i--;
			pre2 = i + 1;
			i = post2;
		}//记录尾字符尾N的单词在字符串中的首尾索引
		i++;
	}
	i = 0;
	char* p = pOut;
	while (pIn[i]!= '\0') {
		if (i == pre1) {
			for (int j = 0; j < post2 - pre2 + 1; j++)
				*p++ = pIn[pre2 + j];
			i = post1 + 1;
		}//pIn移动到第一个交换单词的位置,将第二个交换单词赋给pOut
		if (i == pre2) {
			for (int j = 0; j < post1 - pre1 + 1; j++)
				*p++ = pIn[pre1 + j];
			i = post2 + 1;
		}//pIn移动到第二个交换单词的位置,将第一个交换单词赋给pOut
		//交换后将pIn移动到第二个交换单词后
		if (pIn[i] == '\0') break;
		*p++ = pIn[i++];//非交换单词,直接赋给pOut
	}
	*p = pIn[i];
	return;
}
发布了3 篇原创文章 · 获赞 1 · 访问量 114

猜你喜欢

转载自blog.csdn.net/weixin_42780429/article/details/104875092