题目:读入一行文本,包含若干个单词(以空格间隔,或文本结束)。将其中的以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;
}