题目
pat
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
思考
1.通过对空格位置进行操作。为每个空格标记位置,输出时输出空格后的字符直到或
\0
。
2.倒序遍历数组,检测到空格就输出一个单词。
代码
代码1
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char in[81]; //输入字符
int spno[80]; //字符空格位置
int j = 0;
int spnum = 0; //字符空格数
cin.get(in, 80); //使字符串中能出现空格,回车结束
int len = strlen(in); //长度
for (int i = 0; i < len; i++) //获得空格数及其位置
{
if (in[i] == ' ')
{
spno[j] = i;
spnum++;
j++;
}
}
j--;
while (j >= 0) //倒叙输出
{
int m = 0;
int st = spno[j] + 1;
while (in[st + m] != ' ' && in[st + m] != '\0')
{
cout << in[st + m];
m++;
}
j--;
cout << " ";
}
j++;
int n;
/*
因为第一个单词前没有空格,
且最后不能输出空格,
所以单独输出,不放入上面的循环
*/
while(n<spno[j])
{
if(in[n]!=' ')
{
cout<<in[n];
n++;
}
}
//system("pause");
}
代码2
#include <iostream>
#include <string.h>
using namespace std;
int main() {
char in[81]; //创建字符串
cin.get(in, 81); //读取字符串
int i = 0; //数组下标
for (i = strlen(in); i > 0; i--)//从末尾开始遍历字符串
{
if (in[i] == ' ')//检测到空格
{
printf("%s ", &in[i+1]); //输出空格后的单词
in[i] = '\0'; //把空格改为 \0
}
}
printf("%s", &in[i]);
system("pause") ;
}
遇到的问题
如何定位空格,来输出单词。
当字符串开头有空格时,代码1会出错。
用到的方法
可以使字符串中出现空格,如果直接用cin
,遇到空格时字符串输入结束。
#include <string.h>
cin.get(in, 80);
如何不使用循环,在一行代码输出几个字符。
printf("%s", &str[i]);
&str[i]
就是一个指针,也就是str[i]
的地址。而按 %s
格式是输出一个字符串,后面的那个指针(第二个参数)就是指定第一个字符的地址的。printf会输出从这个地址开始的所有字符,直到遇到第一个’\0’字符时停止(’\0’不会输出)。