输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。
分析:由于编写字符串相关代码能够反映程序员的编程能力和编程习惯,与字符串相关的问题一直是程序员笔试、面试题的热门题目。本题也曾多次受到包括微软在内的大量公司的青睐。
由于本题需要翻转句子,我们先颠倒句子中的所有字符。这时,不但翻转了句子中单词的顺序,而且单词内字符也被翻转了。我们再颠倒每个单词内的字符。由于单词内的字符被翻转两次,因此顺序仍然和输入时的顺序保持一致。
还是以上面的输入为例子。翻转“I am a student.”中所有字符得到“.tneduts a ma I”,再翻转每个单词中字符的顺序得到“students. a am I”,正是符合要求的输出。
#include <stdio.h> #include <stdlib.h>
#define MAX 100
void revert(char* str, int begin, int end) { int len = end - begin; int i; char tmp; for(i=0;i<len/2;i++) { tmp = str[begin+i]; str[begin+i] = str[begin+len-i-1]; str[begin+len-i-1] = tmp; } }
char* str_process(char* str) { int len = strlen(str); revert(str,0,len); printf("after revert the str is %s\n",str); char* tmp = str; int start = 0; int end = 0; while(tmp[end]!='\0') { if(str[start] == ' ') { start++; end++; continue; } else if(str[end] == ' ' || str[end] == '\0') { revert(str,start,end); start = end; } else { end++; } } return str; } int main(int argc, char *argv[]) { char* str = (char*)malloc(MAX); sprintf(str, "%s", "I am a student."); printf("str is %s\n",str); printf("after process the str is %s\n",str_process(str)); system("PAUSE"); return 0; }
|
感谢梅总的指正,上面的代码如果str为"Ii am a student"就是说第一个单词为多个字符时就会错误,因为取不到str[end] == '\0'这个
修正代码如下:
#include <stdio.h> #include <stdlib.h>
#define MAX 100
void revert(char* str, int begin, int end) { int len = end - begin + 1; int i; char tmp; for(i=0;i<len/2;i++) { tmp = str[begin+i]; str[begin+i] = str[begin+len-i-1]; str[begin+len-i-1] = tmp; } }
char* str_process(char* str) { int len = strlen(str); revert(str,0,len-1); printf("after revert the str is %s\n",str); //char* tmp = str;
int start = 0; int end = 0; while(str[end]!='\0') { system("PAUSE"); printf("start is %c, end is %c\n", str[start],str[end]); if(str[start] == ' ') { start++; end++; continue; } else if(str[end+1] == ' ') { revert(str, start, end); end++; start = end; } else if( str[end + 1] == '\0') { revert(str, start, end); end++; } else end++; } return str; } int main(int argc, char *argv[]) { char* str = (char*)malloc(MAX); sprintf(str, "%s", "We love china"); printf("str is %s\n",str); printf("after process the str is %s\n",str_process(str)); system("PAUSE"); return 0; }
|
阅读(1188) | 评论(0) | 转发(0) |