题目:翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母同样处理,例如:输入 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"在栈区。