数组和冒泡排序,就是把一串由大到小排序的数组,变成由小到大排序(sizeof,strlen)

#include<stdio.h>
int  main()
{
	int arr[10] = { 0 };
	// 这个数组表示一共可以有10个元素,但是我只设置的第一个元素的值,
	// 其它元素默认为0(其实字符"/0"的ASCII码也是0)
	// 如果是arr[] = { 0 };没有设置数组的元素个数那么,
	// 数组会根据所赋予值的个数来自己创建元素的个数
	// 如arr[] = { 0 };那么这个数组的元素个数就是1
	// 不过char ch1[]="bit";这个数组的元素个数是4,
	// 因为"bit"会在后面自动生成一个"/0",这个"/0"也需要一个空间来放置的
	// 
	// 
	// char ch1[]="bit";和char ch2[]={'b','i'.'t'};是有区别的
	// 如strlen(ch1):显示的字符个数就是3,因为"bit"会在后面自动生成一个"/0"
	// 而strlen(ch2):显示的字符个数是随机值,因为'b','i'.'t'不会生成"/0",
	// 那么strlen就会一直往数,直到数到了"/0"才会停止。(字符个数不计"/0")
	// 再如:printf("%s",ch1);显示的就是bit
	// 而printf("%s",ch2);显示的就是bit烫烫烫(后面一堆乱码,直到碰到/0才停止打印)
	//

		
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("%d\n", sizeof(arr));//结果是40
	print
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以先定义一个指针数组,存储这5个字符,然后使用冒泡排序或快速排序等算法将它们按照字符中字符个数由小到大排序排序完成后,遍历指针数组,取出每个字符的第三个字母,如果少于三个字符则输出空格,否则将第三个字母合并成一个新的字符输出即可。 示例代码: ```c #include <stdio.h> #include <string.h> #define MAX_LEN 100 int main() { char str1[MAX_LEN] = "hello"; char str2[MAX_LEN] = "world"; char str3[MAX_LEN] = "apple"; char str4[MAX_LEN] = "banana"; char str5[MAX_LEN] = "cat"; char *strArr[] = {str1, str2, str3, str4, str5}; int len = sizeof(strArr) / sizeof(char *); // 冒泡排序 for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - i - 1; j++) { if (strlen(strArr[j]) > strlen(strArr[j + 1])) { char *temp = strArr[j]; strArr[j] = strArr[j + 1]; strArr[j + 1] = temp; } } } // 取出每个字符的第三个字母合并成一个新的字符输出 char result[MAX_LEN] = ""; for (int i = 0; i < len; i++) { if (strlen(strArr[i]) >= 3) { char c = strArr[i][2]; strncat(result, &c, 1); } else { strcat(result, " "); } } printf("排序后的字符数组:\n"); for (int i = 0; i < len; i++) { printf("%s\n", strArr[i]); } printf("合并后的新字符:%s\n", result); return 0; } ``` ### 回答2: 首先,我们需要定义五个字符,并用指针数组来存储它们。 ```c char str1[] = "abc"; char str2[] = "defg"; char str3[] = "hijkl"; char str4[] = "mnopqrs"; char str5[] = "tuvwxyz"; char *str[] = {str1, str2, str3, str4, str5}; ``` 接下来,我们需要写一个排序函数,将字符按照字符个数由小到大排序。这里采用快速排序算法实现,时间复杂度为O(nlogn)。 ```c int cmp(const void *a, const void *b) { return strlen(*(char **)a) - strlen(*(char **)b); } void sort(char **s, int len) { qsort(s, len, sizeof(char *), cmp); } ``` 然后,我们需要写一个函数来取出每个字符的第三个字母,合并成一个新的字符输出。 ```c void merge(char **s, int len) { char result[6] = ""; for (int i = 0; i < len; i++) { if (strlen(s[i]) >= 3) { strncat(result, s[i] + 2, 1); } else { strcat(result, " "); } } printf("%s\n", result); } ``` 最后,我们将这些函数组合在一起。 ```c int main() { sort(str, 5); merge(str, 5); return 0; } ``` 完整代码: ```c #include <stdio.h> #include <string.h> #include <stdlib.h> char str1[] = "abc"; char str2[] = "defg"; char str3[] = "hijkl"; char str4[] = "mnopqrs"; char str5[] = "tuvwxyz"; char *str[] = {str1, str2, str3, str4, str5}; int cmp(const void *a, const void *b) { return strlen(*(char **)a) - strlen(*(char **)b); } void sort(char **s, int len) { qsort(s, len, sizeof(char *), cmp); } void merge(char **s, int len) { char result[6] = ""; for (int i = 0; i < len; i++) { if (strlen(s[i]) >= 3) { strncat(result, s[i] + 2, 1); } else { strcat(result, " "); } } printf("%s\n", result); } int main() { sort(str, 5); merge(str, 5); return 0; } ``` ### 回答3: 题目要求将五个字符按照其中字符个数由小到大排序,这个可以使用快速排序实现。具体做法是,选取其中一个字符作为基准,将其余的字符按照与基准字符长度的大小关系分为两组。对于每一组,递归地进行排序,最后将排序好的两个字符数组合并即可。这一过程中需要用到字符指针和指针数组。 首先,定义一个指针数组,用于存储五个字符的指针。接着,编写一个函数用于比较两个字符的长度大小,以在排序中使用。具体函数实现如下所示: ``` int compare(const void * p1,const void * p2){ char * s1 = *(char **)p1; char * s2 = *(char **)p2; if(strlen(s1) < strlen(s2)){ return -1; }else if(strlen(s1) > strlen(s2)){ return 1; }else{ return 0; } } ``` 该函数中参数 p1 和 p2 是指向指针的指针,它们通过强制类型转换变成了 char 类型的指针,即指向字符的指针。接着,比较两个字符的长度,根据返回结果判断它们的大小关系。 编写完比较函数之后,就可以使用 qsort 函数对指针数组进行排序。使用该函数需要注意,它的第一个参数是指向排序数组的指针,第二个参数是数组长度,第三个参数是每个元素的大小,第四个参数是比较函数的指针。下面是代码示例: ``` char * str[] = {"tiger", "lion", "elephant", "giraffe", "zebra"}; int len = sizeof(str)/sizeof(str[0]); // 获取数组长度 qsort(str, len, sizeof(str[0]), compare); // 对指针数组进行排序 ``` 排序完成之后,可以使用循环遍历指针数组,分别取出每个字符的第三个字母,将它们合并成一个新的字符进行输出。具体实现如下: ``` char new_str[6] = ""; for(int i=0; i<len; i++){ char * s = (*(str+i)+2); if(strlen(s)>=3){ strncat(new_str,s,1); }else{ strncat(new_str," ",1); } } printf("%s\n",new_str); ``` 该代码中,定义了一个新的字符 new_str 用于存储合并之后的字符。使用 strncat 函数将所有第三个字母连接到 new_str 中,如果某个字符的长度少于三个字符,则在 new_str 中输出一个空格。最后,使用 printf 函数输出合并之后的字符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值