Bubblesorting массив с манипуляцией строк и функций - PullRequest
0 голосов
/ 28 мая 2018

Вопрос

Итак, я пытался закодировать двухэтапную программу, которая имеет строку (постоянная строка. Она задана) и выполняет:

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

Извините за плохую инициализацию переменных, а также за написание материала на неанглийском, ноэтот кусок кода должен быть моим рабочим листом, а английский не мой родной.Мир

1 Ответ

0 голосов
/ 28 мая 2018

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

Примечание: вы должны заменить константы 6,7 в циклах с чем-то более общим, поэтому та же функция будет работать с другими номерами городов.

...