使用字符串操作和函数对数组进行Bubblesorting

时间:2018-05-28 01:40:39

标签: c arrays string sorting bubble-sort

问题

所以我一直在尝试编写一个包含字符串的2阶段程序(它是一个常量字符串。它是给定的。)并且确实:

  1. 查找以指定字母开头的项目
  2. 按字母顺序对该字符串中的项目进行排序。
  3. 问题

    我需要帮助我的程序的第二部分,因为第一部分做得很好。执行代码时,我应该看到城市 按字母顺序排序 。但相反,我看到this胡说八道。

    我是一个完整的菜鸟,我在每一个字符串/字符操作相关主题上遇到问题。所以任何有关任何事情的帮助都将受到赞赏。

    这是我的代码:

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    void sortStartwB(const char strSehir[]);
    void sortCities(const char strSehir[]);
    
    int main()
    {
        const char strSehir[100] = "Bursa Yozgat Canakkale Balikesir Adana Eskisehir Bilecik";
        sortStartwB(strSehir);
        sortCities(strSehir);
        return 0;
    }
    
    void sortStartwB(const char strSehir[])
    {
        char strNew[100];
        strcpy(strNew, strSehir);
        char *ptrSehir;
        char strBsehir[50] = {}; 
    
        ptrSehir = strtok(strNew, " ");
    
    
        while (ptrSehir != NULL)
        {
            if (strncmp(ptrSehir, "B", 1) == 0)
            {
                strcat(strBsehir, ptrSehir);
                strcat(strBsehir, " ");
            }
            ptrSehir = strtok(NULL, " ");
        }
    
        printf("\nb ile baslayan sehirler : \n%s\n", strBsehir);
    }
    
    void sortCities(const char strSehir[])
    {
        char strFunc[100];
        char *strSorted[100];
        int i = 0;
    
        char temp[50];
    
        strcpy(strFunc, strSehir);
    
        strSorted[i]=strtok(strFunc, " ");
    
        while (strSorted[i] != NULL)
        {
            strSorted[++i] = strtok(NULL, " ");
        }
    
        for (int j=0; j<6; j++)
        {
            for (int k=j+1; k<7; k++)
            {
                if (strcmp(strSorted[j], strSorted[k]) > 0)
                {
                    strcpy(temp, strSorted[j]);
                    strcpy(strSorted[j], strSorted[k]);
                    strcpy(strSorted[k], temp);
                }
            }
        }
    
        for (int x=0; x < 7; x++)
        {
            printf("\n%s", strSorted[x]);
        }
    }
    

    很抱歉初始化变量很糟糕,而且还用非英语写东西,但这段代码意味着我的工作表,而英语不是我的母语。和平

1 个答案:

答案 0 :(得分:1)

strok返回原始字符串中的指针。当你对cities数组进行排序时,你会通过重写不同大小的单词来搞乱原始字符串。

您需要做的是将char[]中的每个城市名称复制得足够大,以便您可以在其上重写任何其他城市名称,而不会弄乱其他城市名称。

这是一个应该有效的例子:

void sortCities(const char strSehir[])
{
    char strFunc[100];
    char strSorted[100][100];
    char *city;
    int i = 0;

    char temp[50];

    strcpy(strFunc, strSehir);

    for (city = strtok(strFunc, " "); city != NULL; city = strtok(NULL, " "))
        strcpy(strSorted[i++], city);

    for (int j=0; j<6; j++)
    {
        for (int k=j+1; k<7; k++)
        {
            if (strcmp(strSorted[j], strSorted[k]) > 0)
            {
                strcpy(temp, strSorted[j]);
                strcpy(strSorted[j], strSorted[k]);
                strcpy(strSorted[k], temp);
            }
        }
    }

    for (int x=0; x < 7; x++)
    {
        printf("\n%s", strSorted[x]);
    }
}

除了注意:你应该用更通用的东西替换循环中的常量67,这样相同的函数将适用于其他数量的城市。