有一个英文句子,每个单词(term)之间用空格分隔,例如:I like English very much 要求反转后变为 much very English like I
上面的问题可以利用C语言中字符串已'\0'结尾,且'\0'是字符串打印的截止符,代码如下:(这只是打印出反转的字符串,而不是针对原串反转)
#include <stdio.h> #include <string.h> void reverse(char *s){ int len = strlen(s); int i; for(int i = len; i >=0 ; i --){ if(s[i] == ' '){ s[i] = '\0'; printf("%s ", s + i + 1); } } printf("%s\n", s); }
如果只是打印还可以使用栈,从字符串的末尾进行遍历,遇到空格后将栈中的元素全部pop,直到字符串从尾到头遍历完成。
以上都是打印按term反转的字符串,如果是改变原来的字符串呢?
可以这样考虑,先将字符串整体反转,然后从头遍历,当遇到空格时将这个term再次进行反转,到末尾时整个字符串反转完毕。
/************************************************************************* > File Name: reverse_term.c > Author: desionwang > Mail: wdxin1322@qq.com > Created Time: Thu 14 Nov 2013 09:55:17 AM CST ************************************************************************/ #include<stdio.h> #include<string.h> int reverse(char *str, int l, int h){ if(str == NULL){ return -1; } while(l <= h){ char tem = str[l]; str[l] = str[h]; str[h] = tem; l++; h--; } return 0; } int reverse_term(char *str, int l, int h){ reverse(str, l, h); int s = 0, e = 0; char *p = str; while(*p != '\0'){ if(*p == ' '){ reverse(str, s, e-1); s = e + 1; } p++; e++; } } int main(int argc, char *argv[]){ char *str = argv[1]; int len = strlen(str); reverse_term(str, 0, len-1); printf("%s\n", str); }