题目要求:
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。(注意处理在输入字符串时的回车字符)
输入:需反转的字符串
输出:按照要求反转后的字符串
示例:例如输入“I am a student.”,则输出“student. a am I”
自己写的代码如下:仅供参考,如有错误和不妥之处,请大家指正。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char *str = NULL;
int i = 0;
int k = 0;
char ch;
str = (char *)malloc(128*sizeof(char));//给str分配堆空间
if( str == NULL )
{
printf("malloc error
");
return -1;
}
memset(str, 0, 128);
// gets(str);//输入方案一
#if 1//输入方案2
while(((scanf("%c", &ch) == 1)) && (ch != 10))//当scanf与ch!=10调换位置后,会出问题,导致'/n'被写入str,调试中用到了下面被//注掉的代码,去掉尾部的'/n'
{
*str++ = ch;
k++;
}
//str--;
//*str = ' ';
//str++;
while(k > 0)//回到str的头部
{
str--;
k--;
}
#endif
while(*str != ' ')//将字符串中的空格都转换为回车
{
if(*str != 32)//与空格的ascii码32比较
{
str++;
}
else//是空格则换成' '
{
*str = ' ';
i++;
str++;
}
}
str--;
i++;//当字符串中单词数为2时,只有一个空格,故要将空格数+1才与单词数相同
while(i >= 0)
{
while(*str != ' ')//从后向前寻找单词,单词有i+1个,以' '隔开
str--;
str++;
printf("%s ", str);//打印找到的单词
str--;
str--;
i--;
}
printf(" ");
free(str);
return 0;
}
// gets(str);//输入方案一
#if 1//输入方案2
while(((scanf("%c", &ch) == 1)) && (ch != 10))//当scanf与ch!=10调换位置后,会出问题,导致'/n'被写入str,调试中用到了下面被//注掉的代码,去掉尾部的'/n'
{
*str++ = ch;
k++;
}
//str--;
//*str = ' ';
//str++;
while(k > 0)//回到str的头部
{
str--;
k--;
}
#endif
while(*str != ' ')//将字符串中的空格都转换为回车
{
if(*str != 32)//与空格的ascii码32比较
{
str++;
}
else//是空格则换成' '
{
*str = ' ';
i++;
str++;
}
}
str--;
i++;//当字符串中单词数为2时,只有一个空格,故要将空格数+1才与单词数相同
while(i >= 0)
{
while(*str != ' ')//从后向前寻找单词,单词有i+1个,以' '隔开
str--;
str++;
printf("%s ", str);//打印找到的单词
str--;
str--;
i--;
}
printf(" ");
free(str);
return 0;
}