user-0 提问: 把字符数组"I love baofeng" 转换为"baofeng love I",不另外申请内存

回复:
user: user-1
content: 引用 12 楼 rocktyt2 的回复:我觉得单词应该用代码来分割而不是写死位置，这样和直接输出结果有什么区别？[/quote]  小改一下就行了   void reverse (char *first, char *last) {   while ((first!=last)&&(first!=--last)) {     swap(*first, *last);     ++first;   } }  void reverse_sentence(char *first, char *last) {     reverse(first, last);     char *space = first;     while(space != last){         if(*space == ' '){             reverse(first, space);             first = space;             ++first;         }         ++space;     } }  int main() {     char strs[] = "I love baofeng";     reverse_sentence(strs, strs + sizeof(strs) / sizeof(char) - 1);     printf("%s\n", strs);      return 0; }

user: user-2
content: 引用 11 楼 stereoMatching 的回复:算了，送佛送到西  //#include <cstdio> #include <stdio.h>  #define swap(a,b)  {char temp = a; a = b; b = temp;}  void reverse (char *first, char *last) {   while ((first!=last)&&(first!=--last)) {     swap(*first, *last);     ++first;   } }  int main() {     char strs[] = "I love baofeng";     printf("%s\n", strs);     reverse(strs, strs + sizeof(strs) / sizeof(char) - 1);     printf("%s\n", strs);     reverse(strs, strs + 7);     reverse(strs + 8, strs + 12);     printf("%s\n", strs);      return 0; } 我觉得单词应该用代码来分割而不是写死位置，这样和直接输出结果有什么区别？

user: user-1
content: 算了，送佛送到西  //#include <cstdio> #include <stdio.h>  #define swap(a,b)  {char temp = a; a = b; b = temp;}  void reverse (char *first, char *last) {   while ((first!=last)&&(first!=--last)) {     swap(*first, *last);     ++first;   } }  int main() {     char strs[] = "I love baofeng";     printf("%s\n", strs);     reverse(strs, strs + sizeof(strs) / sizeof(char) - 1);     printf("%s\n", strs);     reverse(strs, strs + 7);     reverse(strs + 8, strs + 12);     printf("%s\n", strs);      return 0; }

user: user-3
content: 引用 8 楼 pathletboy 的回复:[quote=引用 4 楼 luoyihu 的回复:] [quote=引用 2 楼 pathletboy 的回复:] 其实是这样解答的~ #include <stdio.h>   int main(void) { char srcStr[15] = "I love baofeng"; strcpy(srcStr, "baofeng love I"); printf("%s", srcStr); return 0; }  第5行strcpy(srcStr, "baofeng love I"); 这里面的静态字符串 "baofeng love I" 申请新的内存空间了吧[/quote]  没申请，编译时候就在code段了。[/quote] 这个应该对吧。。。

user: user-1
content: 接5楼的reverse  #include <algorithm> #include <iostream>  void reverse (char *first, char *last) {   while ((first!=last)&&(first!=--last)) {     std::swap(*first, *last);     ++first;   } }  int main() {     char strs[] = "I love baofeng";     std::cout<<strs<<std::endl;     std::reverse(strs, strs + sizeof(strs) / sizeof(char) - 1);     std::cout<<strs<<std::endl;     reverse(strs, strs + 7);     reverse(strs + 8, strs + 12);     std::cout<<strs<<std::endl;       return 0; }   swap和输出的部分自己转成c的形式吧，这个应该懂吧？

user: user-4
content: 引用 4 楼 luoyihu 的回复:[quote=引用 2 楼 pathletboy 的回复:] 其实是这样解答的~ #include <stdio.h>   int main(void) { char srcStr[15] = "I love baofeng"; strcpy(srcStr, "baofeng love I"); printf("%s", srcStr); return 0; }  第5行strcpy(srcStr, "baofeng love I"); 这里面的静态字符串 "baofeng love I" 申请新的内存空间了吧[/quote]  没申请，编译时候就在code段了。

user: user-5
content: 先整个字符串反转，然后根据空格的位置，依次反转每个单词。

user: user-6
content: 参考http://blog.csdn.net/turingo/article/details/8124432  引用 楼主 luoyihu 的回复:这是去年暴风影音校园招聘时的笔试题,不知道今年还有没有.困扰我一年了,不知道是不是这样解答的  #include<stdio.h> #define swap(a,b)  {(a)=(a)+(b); (b)=(a)-(b); (a)=(a)-(b);} void main() { 	char srcStr[15] = "I love baofeng"; 	int i = 0;	// 计数  	printf("%s\n",srcStr ); 	for( i = 0; i < 7; i++ ) 	{ 		swap( srcStr[i], srcStr[i+7] ); 		printf("%s\n",srcStr ); 	}	// "baofengI love "  	swap( srcStr[7], srcStr[13] );	// "baofeng  loveI"(注意,中间是两个空格) 	printf("%s\n",srcStr );  	for( i=0; i<4; i++ ) 	{ 		swap( srcStr[i+8], srcStr[i+9] ); 		printf("%s\n",srcStr ); 	} 	printf("%s",srcStr ); }  当然,变量i可以不申请,把for循环一条一条的写出来.我这里不想那么麻烦,就这样写了

user: user-1
content: 关键的reverse其实可以很简单  void reverse (char *first, char *last) {   while ((first!=last)&&(first!=--last)) {     swap(*first, *last);     ++first;   } }   char strs[] = "I love baofeng"; reverse(strs, strs + sizeof(strs) / sizeof(char));

user: user-0
content: 引用 2 楼 pathletboy 的回复:其实是这样解答的~ #include <stdio.h>   int main(void) { char srcStr[15] = "I love baofeng"; strcpy(srcStr, "baofeng love I"); printf("%s", srcStr); return 0; }   第5行strcpy(srcStr, "baofeng love I"); 这里面的静态字符串 "baofeng love I" 申请新的内存空间了吧

user: user-0
content: 引用 1 楼 gsw945 的回复:#include<stdio.h> #include<string.h> //翻转函数，将字符数组元素首尾互换 void swapstr(char *head,char *tail) { 	while(head < tail){ 		char c = *head; 		*head = *tail; 		*tail = c;  		tail--; 		head++; 	} }  int main(void) { 	char str[128] = {0}; 	 	printf("please input a sentence:\n"); //	scanf("%s",str); //此处建议使用fgets()函数，fgets()能够接收到空格和回车 	fgets(str,128,stdin); //去掉接收到的回车符 	str[strlen(str)-1] = '\0';  	char *p,*head,*tail;  	p = head = tail =&str[0]; 	 	while(*tail != '\0'){ 		tail++; 	} 	tail -= sizeof(char);//定位最后一个字符的位置 	swapstr(head,tail);//将整句话按照字母翻转  	while(*p != '\0'){ //翻转字符数组中的单词 		if(*p == ' '){ 			tail = p - sizeof(char); 			swapstr(head,tail); 			head = ++p; 		} //此处用while()或者if(),if版本参见源码 		while(*head == ' '){ 			head++; 		}  		p++; 	} //最后一个单词的翻转 	if(*p == '\0'){ 		tail = p - sizeof(char); 		swapstr(head,tail); 	} 	 	puts(str); 	 	return 0; }  /*非本人原创代码，借鉴于此，仅供参考，稍微修改即可满足此题*/    这个不是要翻转字符串的 I love baofeng 到 baofeng love I 而且人家要求不能申请行的内存空间

user: user-0
content: 我勒个去,给分给错了 对不起stereoMatching了

user: user-7
content: 写得很烂，求大神贴更简单的方法 #include <stdio.h>   void reverse(char *str) { 	char temp; 	char *last_char; 	 	for (last_char = str; *last_char != '\0'; last_char++) 		; 	last_char--;  	while (str < last_char) 	{ 		temp = *str; 		*str++ = *last_char; 		*last_char-- = temp; 	} }  void reverse2(char *str) { 	char temp; 	char *last_char;  	if (*(str+1) == '\0') 	{ 		return; 	} 	 	for (last_char = str; *last_char != ' '; last_char++) 		; 	last_char--;  	while (str < last_char) 	{ 		temp = *str; 		*str++ = *last_char; 		*last_char-- = temp; 	} }  int main() { 	char s[] = "I love baofeng"; 	char *p ; 	int i = 0; 	reverse(s); 	while (1) 	{ 		p = &s[i]; 		reverse2(p); 		while (s[i] != ' ' && s[i] != '\0') 		{ 			i++; 		} 		while ( s[i] == ' ') 		{//跳过空格 			i++;  		}  		if (s[i] == '\0') 		{ 			break; 		}  	} 	printf("%s\n",s); 	return 0; }

user: user-4
content: 其实是这样解答的~ #include <stdio.h>   int main(void) { char srcStr[15] = "I love baofeng"; strcpy(srcStr, "baofeng love I"); printf("%s", srcStr); return 0; }

user: user-8
content: #include<stdio.h> #include<string.h> //翻转函数，将字符数组元素首尾互换 void swapstr(char *head,char *tail) { 	while(head < tail){ 		char c = *head; 		*head = *tail; 		*tail = c;  		tail--; 		head++; 	} }  int main(void) { 	char str[128] = {0}; 	 	printf("please input a sentence:\n"); //	scanf("%s",str); //此处建议使用fgets()函数，fgets()能够接收到空格和回车 	fgets(str,128,stdin); //去掉接收到的回车符 	str[strlen(str)-1] = '\0';  	char *p,*head,*tail;  	p = head = tail =&str[0]; 	 	while(*tail != '\0'){ 		tail++; 	} 	tail -= sizeof(char);//定位最后一个字符的位置 	swapstr(head,tail);//将整句话按照字母翻转  	while(*p != '\0'){ //翻转字符数组中的单词 		if(*p == ' '){ 			tail = p - sizeof(char); 			swapstr(head,tail); 			head = ++p; 		} //此处用while()或者if(),if版本参见源码 		while(*head == ' '){ 			head++; 		}  		p++; 	} //最后一个单词的翻转 	if(*p == '\0'){ 		tail = p - sizeof(char); 		swapstr(head,tail); 	} 	 	puts(str); 	 	return 0; }  /*非本人原创代码，借鉴于此，仅供参考，稍微修改即可满足此题*/