题目描述:
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
C语言实现代码如下:
#include<stdio.h>
#include<string.h>
int main(){
char str[81][81];
int i = 0;
for(i=0;i<10;i++){
scanf("%s", &str[i]);
if(getchar()=='\n') break;
}
// 此时i的值就是最后一个单词的下标
int p = 0;
int q = i;
while(p<q){
char tmp[81];
strcpy(tmp, str[p]);
strcpy(str[p], str[q]);
strcpy(str[q], tmp);
p++;
q--;
}
for(int j=0;j<=i;j++){
printf("%s", str[j]);
if(j!=i) printf(" ");
}
}
受到昨天1008的影响,这里我的思路是把每个单词取出来放进数组,然后以中点为轴交换位置。交换不难,主要是在读输入的时候遇到问题。由于没有变长数组,所以只能定义81*81的字符数组。scanf函数循环读取字符串的时候,遇到空格或回车就视为读完此串。但是如果循环没有结束,依然会等待输入。也就是说,如果没有这一句
if(getchar()=='\n') break;
那么即使输入只有五个单词,在输入完按下回车后,仍然没有停止读入(也许要按到80个回车)。
然后贴一个网上看到的更好的解法(Hunter1023):
int main() {
char str[81]; //创建字符串
gets(str); //读取字符串
int i = 0; //数组下标
for (i = strlen(str); i > 0; i--) { //从末尾开始遍历字符串
if (str[i] == ' ') { //如果遇到空格
printf("%s ", &str[i+1]); //输出空格后的单词
str[i] = '\0'; //把空格改为 \0,使后续输出也只有一个单词
}
}
printf("%s", &str[i]); //输出原字符串的第一个单词
return 0;
}
确实巧妙,直接从末尾往前读。并且手工添加’\0’,读出每一个单词。并且printf这样用我是没想到的:
printf("%s ", &str[i+1]); //输出空格后的单词
无论是空间还是时间都更优。