首页 > 解决方案 > 使用字符串操作和函数对数组进行冒泡排序

问题描述

问题

所以我一直在尝试编写一个包含字符串的两阶段程序(它是一个常量字符串。它是给定的。)并且执行以下操作:

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

问题

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

我是一个完全的菜鸟,我在字符串/字符操作相关主题的每一点都遇到问题。因此,我们将不胜感激任何有关任何事情的帮助。


这是我的代码:

#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]);
    }
}

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

标签: carraysstringsortingbubble-sort

解决方案


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

您需要做的是将每个城市名称复制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以便相同的功能适用于其他数量的城市。


推荐阅读