给定一个字符串“I love china”,编写程序完成以单词为单位的逆序,如“china love i”,并要求不允许使用第三方变量保存数据,但可以使用辅助指针变量等。
思路及程序编写 思路一
首先将字符串整体倒置:“anihc evol i”
然后再次遍历字符串,将每个单词倒置:“china love i”
程序如下:
#include思路二void swapstr(char *head ,char *tail); int main(int argc, const char *argv[]) { char str[] = "I love china"; char *head = str, *tail = str; puts(str); //先将尾指针定位到字符串尾部 while(*tail != ' ') tail ++; //将整个字符串倒置 swapstr(str, tail - 1); //主函数开始扫描遍历整个倒置后的字符串 while(*head != ' ') { //查找单词头 while(*head == 32) //32是空格 head++; //找到头后将尾定位到头,开始找单词尾 tail = head; while(*tail != 32 && *tail != ' ') tail++; //前两步找到头之后将单词倒置(因为循环结束后tail指向' ',所以tail-1) swapstr(head,tail - 1); //单词倒置后将头指向尾,为下次找单词做准备 head = tail; } puts(str); return 0; } //完成指定字符串倒置 void swapstr(char *head, char *tail) { char temp = 0; while(head < tail) { temp = *head; *head = *tail; *tail = temp; head++; tail--; } }
(这种思路是为了引出strtok函数和指针数组结合用法,可能不满足题目要求,但结果一致。)
首先使用strtok函数进行字符串分割(strtok函数用法可以百度)
然后定义一个指针数组,把分割后的字符串逐个存入指针数组(指针数组概念必须知道)
然后将这个指针数组内的多个字符串用strcat函数进行逆序连接
程序如下:
#include#include int main(int argc, char *argv[]) { char str[] = "i love china"; char *p_arr[3] = {NULL,NULL,NULL}; char arr[100] = {0}; char *p = NULL; int i = 0; p = strtok(str," ");//获取第一个字符串 while(p != NULL) //继续获取其他字符串 直至检测不到字符串返回空指针 { printf("%s ",p); //打印信息,用于调试 p_arr[i] = p; //将获取到的字符串存入指针数组 i++; p = strtok(NULL," "); //获取下一个字符串 } putchar('n'); for(i = 0;i < 3;i++) { printf("%s ",p_arr[i]); //打印调试信息 } putchar('n'); for(i = 2; i >= 0;i--) //倒序 { printf("%s ",p_arr[i]); //打印调试信息 strcat(arr,p_arr[i]); //3个字符串倒着连接 strcat(arr," "); } putchar('n'); puts(arr); //输出结果 return 0; }



