Как сравнить размер словарного словаря (aba <ada) строки, используя только указатели - PullRequest
0 голосов
/ 12 января 2019

Я на первом курсе, сейчас учусь на "С". Это первая задача, которую я на самом деле бью по стене, задача:

"Создать функцию, которая получает указатель строки и указатель размера строки. Сама строка содержит предложение. Функция будет возвращать указатель на начало слова самого большого размера в словаре (aba

Пример: для предложения «aba ada aaa» функция вернет «ada», который позже будет напечатан main.

Я чувствую себя немного застрявшим, я понимаю, что мне нужно пробежать всю строку, используя как минимум 2 указателя (?) Мне нужно продолжать сравнивать их и отбрасывать маленький, пока в конце концов у меня не появится самое большое слово и его размер. но не могу найти способ сделать это.

До этого я написал очень длинный код, который на самом деле не работал, и мне кажется, что я упустил что-то важное и что этот код не должен быть длинным.

int findHighest(char *ptr, int *size)
{
   int nSize = 0, nSize1 = 0;    
   char *ptr3;

   for (char *ptr1 = ptr; *ptr1 != '\0'; ptr1++)
   {
      for (char *ptr2 = ptr1; (*ptr2 != ' ') && (*ptr2 != '\0') ; ptr2++)
      {
          nSize++;
          ptr3 = ptr2;
          nSize1 = nSize;
      }
   }
}
void main()
{
   char sentence[100] = { 0 };
   printf("enter your sentence:\n");
   gets(sentence);
   char sentence2[100];
   int size;
   strcpy(sentence2, findHighest(sentence, &size));
   sentence2[size] = '\0';
   printf("the biggest word is:'%s'\n", sentence2);
   system("pause");
}

1 Ответ

0 голосов
/ 12 января 2019

Если бы вы выполняли аналогичную задачу с целыми числами, как бы это выглядело? Примерно так:

// With ints instead of (sub)strings:
int findHighest(int ints[], int *size) {
    int greatest = ints[0];

    for (int i = 1; i < *size; i++) {
        if (ints[i] > greatest) greatest = ints[i];
    }

    return greatest;
}

Это очень хорошая модель для вашей актуальной проблемы. Проблема заключается в том, как приспособить что-то подобное, чтобы справиться с различиями в типе и форме ввода, с ограничением, которое вы должны избегать при использовании индексации, и с требованием возвращать длину самой большой строки.

Но прежде чем мы продолжим, давайте разберемся с проблемой, которая может сбить вас с толку. В переводе проблема гласит: «Функция вернет указатель на начало» самого большого слова, тогда как в примере вы скажете «функция вернет« ада »». Во-первых, нет, функция никогда не сможет вернуть "ada" сама, потому что это массив , и вы не можете возвращать массивы в C. Но что более важно, когда я прочитал проблему, ваша функция вернуть указатель на начало подстроки "ada" во входной строке . В вашем примере, если вы напечатаете это, скажем, с puts(), то вы увидите ada aaa.

Так как действовать? Начнем с правильной сигнатуры функции:

char *findHighest(char *string, int *size) {

Давайте теперь заметим, что до тех пор, пока ввод не содержит начальных пробелов, начало первого слова совпадает с началом предложения:

    char *greatest = string;

Теперь вам нужно найти начало следующего слова, и длина текущего слова также должна легко получаться из этого. Имея указатель на следующее слово, вы можете сравнить два слова с помощью strcmp(), при условии, что вы готовы предположить, что пробелы между словами лексикографически меньше, чем все буквы, встречающиеся в ваших словах. Это действительно так для всех ASCII-совместимых однобайтовых кодировок, а также для UTF-8: все символы меньше ' ' являются управляющими символами. Однако, если вы хотите быть еще безопаснее, вместо этого вы можете использовать strncmp(), учитывая длину слова.

По мере прохождения строки вам нужно отслеживать не только указатель на самое большое на данный момент слово, но и его длину. Затем в конце вы просто

    *size = length_of_greatest;
    return greatest;
}

Это академическое упражнение, я оставляю вам оставшиеся детали для проработки.

...