user-0 提问: 求教一个C语言问题，给定一个字符串，怎么按单词的长度排序

回复:
user: user-0
content: 代码的问题是 局部变量在函数调用完后自动释放了，数据不能返回，改成全局变量可以解决，小白的我是靠单步调试发现的问题。

user: user-1
content: 这不是很简单吗，先按空格分割（最后一个以结束符‘\0’为标识分割），然后strlen()按照大小排列一下就行。

user: user-2
content: 先得到每一个单词，然后再按照字符串长度排序～

user: user-0
content: 哪位大神 帮我看看 当执行3的时候 报乱码，是怎么回事？谢谢了。  //cpp11.13.11 void menu() { 	printf("=================================================\n"); 	printf("1.打印源字符列表	2.ASCII顺序打印\n"); 	printf("3.按长度递增打印	4.按第一个单词长度打印\n"); 	printf("5.退出\n"); 	printf("=================================================\n"); 	printf("请输入选项："); } void remove_blank_char_only_save_one(char* s, char* ret) { 	int m = 0; 	int i;  	for (i = 0; s[i] != '\0';) { 		//注意判断字符的空格要使用单引号' ',不能使用双引号 		if (s[i] == '\t') { 			s[i] = ' '; 		} 		if (isblank(s[i])) { 			ret[m] = s[i]; 			m++; 			i++; 			while (isblank(s[i])) { 				i++; 			} 		} 		else { 			ret[m] = s[i]; 			m++; 			i++; 		}  	} 	ret[m] = '\0'; } void remove_blank_on_start(char* s) { 	if (s == NULL || *s == '\0') 	{ 		return s; 	}  	int len = 0; 	char* p = s; 	while (*p != '\0' && isspace(*p)) 	{ 		++p; 		++len; 	}  	memmove(s, p, strlen(s) - len + 1);  } void remove_blank_on_end(char* s) { 	if (s == NULL || *s == '\0') 	{ 		return s; 	}  	int len = strlen(s); 	char* p = s + len - 1; 	while (p >= s && isspace(*p)) 	{ 		*p = '\0'; 		--p; 	} } int get_str_words_num(char* s, int n) {  	for (int i = 0; i < strlen(s); i++) { 		if (s[i] == ' ') { 			n++; 		} 	} 	return n + 1; } void sort_str_by_word_len(char* s, char(*des)[10], int num) { 	int j = 0, i, k = 0; 	char t[50];//临时数组，用于交换 	for (int i = 0; i <= strlen(s); i++) { 		if (s[i] != ' ') { 			//以空格分割每个单词，当遇到空格之前，把空格之前的字符存到一个二维数组中 			des[j][k++] = s[i]; 		} 		else { 			//当遇到空格时，添加第一个一维级数组的结束标志，并将J加1开始第二一维数组的赋值，并让K的值归0，从头开始计算。 			des[j][k] = '\0'; 			j++; 			k = 0; 		} 	} 	//使用冒泡法，根据二维数组中各个一维数组的长度进行排序 	for (int m = 0; m < num; m++) { 		for (int n = 0; n < num - m - 1; n++) { 			if (strlen(des[n]) > strlen(des[n + 1])) { 				strcpy(t, des[n]); 				strcpy(des[n], des[n + 1]); 				strcpy(des[n + 1], t); 			} 		} 	} }  void case2(char* s) { 	//冒泡排序法 	char temp; 	char res[50]; 	strcpy(res, s); 	for (int i = 0; i < strlen(res); i++) { 		for (int j = 0; j < strlen(res) - i - 1; j++) { 			if (res[j] > res[j + 1]) { 				temp = res[j]; 				res[j] = res[j + 1]; 				res[j + 1] = temp; 			} 		} 	} 	printf("%s\n", res); } void case3(char *s) { 	char dst[10][50]; 	char res[50]; 	int n_words = 0; 	strcpy(res, s); 	char* temp = res; 	remove_blank_char_only_save_one(s, temp); 	remove_blank_on_start(temp); 	remove_blank_on_end(temp); 	n_words = get_str_words_num(temp, n_words); 	sort_str_by_word_len(temp, dst, n_words); 	for (int i = 0; i < n_words; i++) { 		printf("%s ", dst[i]); 	} 	printf("\n"); }   void myprint(char* s) { 	int num; 	 	menu();  	while (scanf("%d", &num) == 1) { 		switch (num) { 		case 1: 			printf("%s\n", s); 			break; 		case 2: 			case2(s); 			break; 		case 3: 			case3(s);  			 			break;  		case 4:  			break; 		case 5: 			printf("bye!"); 			return; 		default: 			printf("请输入正确的选项！\n"); 			break; 		} 		menu(); 	} 	 } void cpp11_13_11() { 	char ch; 	char str[50]; 	int i = 0;  	printf("please input 10 char:\n"); 	while (i < 49) { 		ch = getchar(); 		str[i] = ch; 		if ((str[i] == '\n') && (str[i - 1] == '\n')) { 			break; 		} 		i++; 	} 	str[i] = '\0'; 	setbuf(stdin, NULL); 	myprint(str); }

user: user-3
content: 先分割成字符串数组，然后按长度排序，最后再按排序后的顺序连接字符串