"softlink between 2 pointers in C"这可能,在字符串排序中需要它



我正试图根据字符串中的字符数对字符串进行排序。我所做的是从用户获取5个输入字符串,并将它们存储在5个数组元素中,然后使用strlen()找到它们的长度。现在我将i = 0到4的strlen(i)的输出存储在一个数组中,并且我需要使用任何排序算法对该数组进行排序。我的代码直到找到每个字符串的长度是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int i;
    char *p[5];  //array of integer pointing to string
    int x[5];    //integer array to store output of strlen()
    printf("Enter the strings to be sorted");
    for(i=0;i<=4;i++)
    {
        p[i]=calloc(100,1);
        scanf("%99sn",p[i]);  //for getting and storing user input i.e string.
    }
    for(i=0;i<=4;i++)
    {
        printf("enetered  [%d] string is = %s : String size = %dn",i, p[i], (int) strlen(p[i])); //for printing the string and its length
    }
    for(i=0;i<=4;i++)
    {
        x[i]=strlen(p[i]); //for storing the length of string in array
    }
    for(i=0;i<=4;i++)
    {
        printf("%dn",x[i]);
    }
#ifdef OLD
    for(i=0;i<=4;i++)
    {
        x[i]=p[i];
    }
    for(i=0;i<=4;i++)
    {
        printf("%st %dn",x[i],strlen(x[i]));
    }
#endif
    return 0;
}

假设x[0]对应字符串p[0]的长度,X[1]到p[1]及类似;由于x[i]是一个整数数组,因此可以对其进行排序。现在有没有办法,当我对整数数组排序时,一些代码与整数数组耦合的字符串也会被洗牌和排序。

我试图找到一种方法来实现这在另一种方式,虽然我仍然是一个初学者水平的学习者。除此之外,如果有人能给我建议任何通用的字符串排序算法。

我的第二个问题是,如果有人可以建议根据字符串中的字符数对字符串进行排序

你不能直接做你想做的事,但你可以用struct s实现类似的事情。

用struct数组代替两个数组。结构体的定义如下:

struct
{
    char* p;        // Will contain the string pointer
    size_t pLength; // Length of the string
} StringDescriptor;
#define NUM_STRINGS 5
struct StringDescriptor strings[NUM_STRINGS];

这样初始化:

for (int i = 0 ; i < NUM_STRINGS ; ++i)
{
    strings[i].p = calloc(100, sizeof(char));
    scanf("%99sn", strings[i].p);
    strings[i].pLength = strlen(strings[i].p);
}

现在要使用qsort()对数组进行排序。首先为你的结构定义一个比较器。

int stringDescriptorComparator(const struct StringDescriptor* left, const struct StringDescriptor* right)
{
    return left->pLength - right->pLength;
}

现在你可以运行qsort了

qsort(strings, NUM_STRINGS, sizeof(struct StringDescriptor), stringDescriptorComparator);

现在你的结构体和其中的字符串指针都是按升序排列的。也就是说,如果上面的代码片段中没有bug,它们就会存在——我甚至没有尝试编译其中的任何一个。

您可以通过在希望成为字符串新的最后一个字符的字符后面写入空字节来截断字符串。例子:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char *str = strdup("Hello, world!");
    printf("%sn", str);
    str[5] = 0; /* length of str is now 5 */
    printf("%sn", str);
    free(str);
    return 0;
}
输出:

你好,世界!

你好

最新更新