Если бы вы выполняли аналогичную задачу с целыми числами, как бы это выглядело? Примерно так:
// 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;
}
Это академическое упражнение, я оставляю вам оставшиеся детали для проработки.