剑指offer:翻转字符串

题目:翻转单词顺序

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母同样处理,例如:输入 I am a student.  输出: student. a am I

思路

①翻转句子中所有字符,比如翻转  I am a student. 结果是  .tneduts a ma I

②翻转每个单词中字符的顺序  就得到了 student. a am I

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

void Reverse(char *pFront, char *pBack)
{
	if (pFront == NULL || pBack == NULL)
	{
		return;
	}
	while (pFront < pBack)//利用交换使字符串逆序
	{
		char tmp = *pFront;
		*pFront = *pBack;
		*pBack = tmp;
		pFront++;
		pBack--;
	}
}

char *ReverseSentence(char *pSentence)
{
	if (pSentence == NULL)
	{
		return NULL;
	}
	char *pFront = pSentence;
	char *pBack= pSentence;//使后指针也指向整个字符串第一个元素
	while (*pBack!= '\0')//pEnd等于‘\0’时退出
	{
		pBack++;
	}
	pBack--;//使后指针指向最后一个元素

	Reverse(pFront, pBack);//翻转整个句子

	/*翻转句子中每个单词
	pFront指向单词的第一个字符,pBack指向单词的最后一个元素时,交换单词内字符顺序*/

	pFront = pBack = pSentence;
	while (*pFront != '\0')
	{
		if (*pFront== ' ')
		{
			pFront++;
			pBack++;
		}
		else if (*pBack == ' ' || *pBack == '\0')
		{
			pBack--;//使后指针指向当前单词的最后一个元素
			Reverse(pFront,pBack);
			pBack++;//使后指针指向已经单词的后一个位置
			pFront = pBack;//重新进入循环
		}
		else
		{
			pBack++;
		}
	}
	return pSentence;
}

int main()
{
	//char *Sentence = "I am a student";
	char Sentence[] = "I am a student";
	printf("%s\n", ReverseSentence(Sentence));
	return 0;
}

 vs2017用指针定义字符串常量时:

定义时直接报错,之前用其他编译器这样可以,百度,修改了一下设置,不提示这个错误了。

int main()
{
	char *Sentence = "I am a student";
	//char Sentence[] = "I am a student";
	printf("%s\n", ReverseSentence(Sentence));
	return 0;
}

执行程序时不打印,调试时,出现下面的提示。

百度发现,改成下面这样就可以了。

int main()
{
	//char *Sentence = "I am a student";
	char Sentence[] = "I am a student";
	printf("%s\n", ReverseSentence(Sentence));
	return 0;
}

解释char *Sentence = "I am a student";

 "I am a student"这个字符串被当作常量,放在内存静态区,Sentence这个指针指向"I am a student”的首地址,这片内存是可读不可写的。调试时,按继续直接跳转到这句。

 

跳转到这句,因为这条语句试图修改字符串常量,所以出错。

那为什么用数组定义的字符串可以修改,而指针定义的不能修改?

因为定义为数组的形式时,"I am a student"在栈区。

 

猜你喜欢

转载自blog.csdn.net/free377096858/article/details/83983564