Написать программу используя указатель второго ранга - C (СИ)
Формулировка задачи:
Найти строку, содержащую наибольшее количество слов, и вывести ее на экран монитора.
Количество строк 5, а максимальное число символов в строке - 80. Массив строк ввести с помощью инициализации
Примечания: Данные вводятся с клавиатуры. В программе при обращении к элементу массива нельзя использовать дополнительную переменную для вычисления его адреса.
Задачу нужно решить применяя указатель второго ранга.
Буду очень признателен за помощь.
Решение задачи: «Написать программу используя указатель второго ранга»
textual
Листинг программы
#include <stdio.h>
#include <ctype.h>
/*
#include <wordexp.h>
size_t wc(const char * s) {
wordexp_t w;
size_t cnt;
cnt = ( wordexp(s, &w, WRDE_NOCMD) ) ? 0 : w.we_wordc;
wordfree(&w);
return cnt;
}
*/
size_t wc(const char * s) {
size_t cnt = 0, inword = 0;
for ( ; *s; ++s ) {
if ( isspace(*s) ) {
if ( inword ) {
cnt += 1;
inword = 0;
}
}
else
inword = 1;
}
return cnt + inword;
}
char ** max_words_string(char ** strings, size_t count) {
return ( count < 2 ) ? strings : max_words_string(strings + (wc(strings[0]) < wc(strings[count - 1])), count - 1);
}
#define STRINGS_COUNT 5
#define STRING_SIZE 81
#define STRING_MASK "%80[^\n]%*c"
const char * STRING_NUMBERS[] = { "first", "second", "third", "fourth", "fifth" };
int main(void) {
char strings[STRINGS_COUNT][STRING_SIZE];
int i /* ,maxidx */;
char * pointers[STRINGS_COUNT];
for ( i = 0; i < STRINGS_COUNT; ++i )
pointers[i] = strings[0] + STRING_SIZE * i;
printf("Enter %u strings:\n", STRINGS_COUNT);
for ( i = 0; i < STRINGS_COUNT && scanf(STRING_MASK, strings[i]) == 1; ++i )
;
if ( i < STRINGS_COUNT ) {
printf("Not enough strings entered!.\n");
return 1;
}
/*
for ( maxidx = 0, i = 1; i < STRINGS_COUNT; ++i )
if ( wc(strings[i]) > wc(strings[maxidx]) )
maxidx = i;
printf("\nMaximum words in %s string.\n", STRING_NUMBERS[maxidx]);
*/
printf("\nMaximum words in %s string.\n", STRING_NUMBERS[max_words_string(pointers, STRINGS_COUNT) - pointers]);
return 0;
}
Объяснение кода листинга программы
- Программа считывает строки из стандартного ввода до тех пор, пока не будет введено 5 строк.
- Переменная
max_words_stringрекурсивно находит строку с максимальным количеством слов в массиве строк. - Переменная
mainidxинициализируется значением 0. - В цикле перебираются строки, и если количество слов в текущей строке больше, чем в строке с максимальным количеством слов, то
maxidxобновляется. - Выводится сообщение с номером строки, содержащей максимальное количество слов.