有5个字符串,首先将它们按照字符串中字符个数由小到大排序,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。要求:利用字符串指针和指针数组实现。
时间: 2023-05-31 16:20:05 浏览: 329
### 回答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 函数输出合并之后的字符串。
阅读全文