1009. 说反话 (20)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。
输出格式:每个测试用例的输出占一行,输出倒序后的句子。
输入样例:Hello World Here I Come输出样例:
Come I Here World Hello
基本思路:拿到题目时第一反应是把输入的字符串存到一个二维数组里,因为二维数组 array[i][j] 可以表示存有i个单词,其中每个单词长度为j。
这样,在输出时,只要printf("%s",array[i]);就好了(相当于i即为每个单词的编号)。这个二维数组的利用和“1004成绩排名”那题完全一样。
由本题所学:
- 字符串的输入函数:getchar(),每次从键盘读入一个字符;gets(str),一次性读取一串字符,包括空格也行(但会溢出,不够安全);
- 还有fgetc()、fgets(),用到再学。但如果是用scanf("%s",str)的话,printf的时候遇到' '(空格)就结束了,所以不好用。(附scanf函数的详细说明)。
- '\0',即空字符。判断一个字符串是否结束的标志就是看是否遇到‘\0’,如果遇到‘\0’,则表示字符串结束。(今天的题就是掉这个坑啦!切记)
第一遍写完的代码:(注意错的地方)#include<stdio.h> #include<string.h> int main(void) { int i,j=0,n=0; char input[81],output[81][20];//s_out可以存放81个词,每个词最长为20 gets(input); for( i = 0; i < strlen( input ); i++ ){ if( input[i] != ' '){ output[j][n++]= input[i]; } else{ j++; n = 0; } } for(;j>=0;j--){ if(j!=0){ printf("%s ",output[j]); } else printf("%s",output[j]); } return 0; }
上面这个代码虽然在电脑上输出的形式是正确的,但就是A不了。后来看了别人的答案才发现是有一个很基础的点没有掌握,即上面提到的字符串的空字符的问题。
下面为修改过的:#include<stdio.h> #include<string.h> int main(void) { int i,j=0,n=0; char input[81],output[81][20];//s_out可以存放81个词,每个词最长为20 gets(input); for( i = 0; i < strlen( input ); i++ ){ if( input[i] != ' '){ output[j][n++]= input[i]; } else{ output[j][n] = '\0'; //<span style="font-family: 'Droid Sans Mono', Consolas, 'Courier New', monospace;">很重要</span> j++; n = 0; } } output[j][n] = '\0'; //这里需要注意的是,当输入最后一个单词后,就跳出循环了,导致最后一个单词结尾未能写入'\0',故在循环外加这一句 for(;j>=0;j--){ if(j!=0){ printf("%s ",output[j]); } else printf("%s",output[j]); } return 0; }
再稍微简洁点的:#include<stdio.h> int main(void) { char c, output[81][20]; int i=0, j=0; while( (c=getchar()) != '\n'){ if( c != ' ' ){ output[i][j++] = c; } else{ output[i][j] = '\0';//用来说明一个单词记录结束了,'\0'是一个字符串结束的标志,如果不加这句话,他是不知道的 i++; j=0; } } output[i][j] = '\0';//最后一个单词的结束,因为输入最后一个字母后就跳出while循环了,所以放这里 for(; i>=0;i--){ if(i!=0){ printf("%s",output[i]); printf(" "); } else printf("%s",output[i]); } return 0; }