题解 | #句子逆序#
句子逆序
http://www.nowcoder.com/questionTerminal/48b3cb4e3c694d9da5526e6255bb73c3
句子逆序C语言低端解法,易于理解。
1.收数据老生常谈。
2.将句子全部逆序。
3.将单词正序。
(这里有一个bug,最后一个词(原句子第一个词)总是收不到,所以写了个补丁。先记录空格的数量,当第二次读取的时候,读到最后一个空格的时候,直接跳进最后一个词,然后单独把最后一个词正序输出,此时用这个小功能内部的变量继承了主循环的变量,正序之后直接将输出第一个词。)
4.通过小功能内部的变量终值与字符串长度比较,以顺利跳出程序。
#include<stdio.h> #include<string.h> int len=0; char stru[10000],in,asb[10000]; int i,j,k; int pau,pau2; char reg; int flag,flag2; int esnum; int main() { //收入数据 while (1) { scanf("%c", &in); // in = getchar(); if (in == '\n') break; stru[len++] = in; } //句子全部逆序 pau = len-1; for(i=0;i<len/2;i++,pau--) { reg = stru[i]; stru[i] = stru[pau]; stru[pau] = reg; //printf("%s",&stru[i]); } //统计空格数量 for(i=0;i<len;i++) { if(stru[i] == ' ') esnum++; } //单词正序 i=0,j=0; for(i=0;i<len;i++) { //最后一个空格之前的单词正序 if((stru[i] == ' ')) { for(k=0;k<j/2;k++,pau--) { reg = asb[k]; asb[k] = asb[pau]; asb[pau] = reg; } for(k=0;k<j;k++) { printf("%c",asb[k]); } j=0; printf(" "); flag++; // if(flag==esnum) // continue; } else { asb[j]=stru[i]; j++; pau=j-1; } if(flag==esnum)//空格数量比较,开启末尾单词正序小功能 { flag2=i; pau2=len-1; for(k=flag2;k<(flag2+(len-flag2)/2);k++,pau2--) { reg = stru[k]; stru[k] = stru[pau2]; stru[pau2] = reg; } for(;flag2<len;flag2++) { printf("%c",stru[flag2]); } printf("\n"); break; } if(flag2==len-1)//小功能内部的变量终值与字符串长度比较 break; } return 0; }