题目描述:例,输入"I am a boy!", 输出"boy! a am I"
目录
一.思路:
1.输入一串带有空格和符号的字符串
2.将单词逆序输出
二:代码实现
1.字符串的输入:
我们使用fgets函数输入,因为scanf函数读到空格会停止输入,不能读取完整的一句话,而gets在某些编译器中不支持,这里不推荐使用。
char arr[10000] = " ";
fgets(arr, 10000, stdin);
特别提示:当我们回车输入的时候,\n也会被放入数组中,当我们逆转单词的时候需要注意这一点
2.单词逆序
1.将整体逆序,然后在将单词逆序,用下图解释
代码如下:(以下代码用于解释题目,便于读者理解,不能正常运行)
cvoid reverse(char* arr,int left, int right) //字符串逆序
{
char ch = ' '; //用于交换字符
while (1)
{
if (left >= right)
{
break;
}
else
{
ch = arr[right];
arr[right] = arr[left];
arr[left] = ch;
left++;
right--;
}
}
}
int main()
{
char arr[10000] = " ";
fgets(arr, 10000, stdin);
int len = strlen(arr); //先计算字符串长度
int left = 0; //数组下标起始位置
reverse(arr, left, len-2); //len - 2是有效字符的位置,len - 1是\n,这点需要特别注意
2.单词逆序:
int tag = 0; //用于判断空格和指定数组位置
left = 0;
while (arr[tag] != '\n')
{
while (arr[tag] != ' ' && arr[tag] != '\n')
{ //当读到空格或者'\n'就需要停下来,然后去调用逆序函数这样就得到正常的单词了
tag++;
}
reverse(arr, left, tag - 1); //tag-1是因为arr[tag]是空格,前面的元素才是需要你逆转的单词
left = tag + 1; //tag+1是下一个单词首元素地址
if (arr[tag] != '\n') //加一是去寻找下一个单词如果不加还停留在空格,就会陷入死循环
{
tag++;
}
}
三:运行演示