Форум программистов, компьютерный форум CyberForum.ru

Поиск самой длинной строки в const char** - C++

Восстановить пароль Регистрация
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
18.03.2014, 16:17     Поиск самой длинной строки в const char** #1
Здравствуйте.
Вот функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <>
char* maxn<char*>(char** const ar, const int* limit) {
    int curmax = 0, absmax = 0, max_ind = 0, count = 0;
    for (int i = 0; (i < *limit), (count = 0); ++i) {
        while (ar[i][count])
            ++count;
        cout << count; //почему не выполняется ???____
        if (count > curmax && count > absmax) { // здесь проверка на текущее максимальное в паре и абсолютное
            absmax = curmax = count;
            max_ind = i;
        }
        else if (count > curmax) // здесь только на текущее
            curmax = count;
    }
    return ar[max_ind];     
}
Не ведется подсчет правильно, оператор, что выше обозначен комментарием, не выполняется, а функция возвращает просто последнюю строчку в массиве.
Что не так?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2014, 16:17     Поиск самой длинной строки в const char**
Посмотрите здесь:

Поиск самой длинной неубывающей подпоследовательности C++
C++ Вывести номер строки матрицы с самой длинной последовательностью одинаковых элементов
C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char C++
C++ Нахождение номера самой длинной строки в матрице
Поиск самой длинной строки в файле C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
18.03.2014, 16:23     Поиск самой длинной строки в const char** #2
Либо я плохо разбираюсь в сях либо туточки:
C++
1
    for (int i = 0; (i < *limit), (count = 0); ++i) {
должно быть так:
C++
1
    for (int i = 0; i < *limit; ++i, count = 0) {
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
18.03.2014, 16:27  [ТС]     Поиск самой длинной строки в const char** #3
Ilot, насколько я понимаю - это идентично в данном случае. Будь count = 0 в проверке цикла, либо в выполнении, компилятор все равно это выполнит...

Исправил - все равно ничего не поменялось.
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,175
Завершенные тесты: 1
18.03.2014, 16:36     Поиск самой длинной строки в const char** #4
Такой цикл выполняется ноль раз.
Вычисляется count=0, а т.к. 0 - это ложь, то цикл заканчивается.
Перенесите его в тело цикла.
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
18.03.2014, 16:39  [ТС]     Поиск самой длинной строки в const char** #5
Ааа...
Ну а как дальше то? Переставил в обновляемую часть - все равно так же само работает.
Цитата Сообщение от zss Посмотреть сообщение
Перенесите его в тело цикла.
Перенес:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <>
char* maxn<char*>(char** ar, const int* limit) {
    int curmax = 0, absmax = 0, max_ind = 0, count = 0;
    for (int i = 0; i < *limit; ++i) {
        count = 0;
        while (ar[i][count])
            ++count;
        cout << count;
        if (count > curmax && count > absmax) {
            absmax = curmax = count;
            max_ind = i;
        }
        else if (count > curmax)
            curmax = count;
    }
    return ar[max_ind];     
}
Все также.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
18.03.2014, 16:42     Поиск самой длинной строки в const char** #6
А я вот исправил и все заработало:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
char* maxn(char** const ar, const int limit) {
    int curmax = 0, absmax = 0, max_ind = 0, count = 0;
    for (int i = 0; i < limit; count = 0, ++i) {
        while (ar[i][count])
            ++count;
        cout << count; //почему не выполняется ???____
        if (count > curmax && count > absmax) { // здесь проверка на текущее максимальное в паре и абсолютное
            absmax = curmax = count;
            max_ind = i;
        }
        else if (count > curmax) // здесь только на текущее
            curmax = count;
    }
    return ar[max_ind];
}
int main() {
 
    char* arr[] = {"",
    "a",
    "asd",
    "b",
    "asdfg",
    "df"
    };
 
    cout <<  maxn(arr, 6) << endl;
 
    return 0;
}

Вот такой ерундой:
C++
1
int* limit
не знамайтесь. Нет смысла передавать в функции указатели на встроенные типы.
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
18.03.2014, 16:49  [ТС]     Поиск самой длинной строки в const char** #7
А вот мой код, может я чего еще не так делаю:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
using namespace std;
 
template <typename T>
T maxn(T*, const int*);
 
template <>
char* maxn<char*>(char**, const int*);
 
int main(int argc, char **argv)
{
    //test arrays:
    const int ari_size = 6;
    int ari[ari_size] = {7, 11, 7, 9, 9, 21};
    const int ard_size = 4;
    double ard[ard_size] = {4.1, 0.01, 71.9, 43};
    const int ars_size = 6;
    const char* ars[ars_size] = {
        "Jammy house",
        "Extraterrestial intelligence",
        "Generally electrical",
        "Free Kenny",
        "Central substance",
        "Silent noise"
    };
    
    cout << maxn(ari, &ari_size);
    cout << endl;
    cout << maxn(ard, &ard_size);
    cout << endl;
    cout << maxn(ars, &ars_size);
    
    return 0;
}
 
template <typename T>
T maxn(T* ar, const int* limit) {
    T curmax = 0, absmax = 0;
    for (int i = 1; i < *limit; ++i)
        if (ar[i] > ar[i-1]) {
            curmax = ar[i];
            if (curmax > absmax)
                absmax = curmax;
        }
    return absmax;
}
 
template <>
char* maxn<char*>(char** ar, const int* limit) {
    int curmax = 0, absmax = 0, max_ind = 0, count = 0;
    for (int i = 0; i < *limit; ++i) {
        count = 0;
        while (ar[i][count])
            ++count;
        cout << count;
        if (count > curmax && count > absmax) {
            absmax = curmax = count;
            max_ind = i;
        }
        else if (count > curmax)
            curmax = count;
    }
    return ar[max_ind];     
}
Добавлено через 4 минуты
Цитата Сообщение от Ilot Посмотреть сообщение
Нет смысла передавать в функции указатели на встроенные типы.
Ок, сделал так:
C++
1
2
3
4
5
template <typename T>
T maxn(T*, const int&);
 
template <>
char* maxn<char*>(char**, const int&);
Все равно мне выдает последнюю строчку.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
18.03.2014, 16:56     Поиск самой длинной строки в const char** #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну так ежу понятно, что вы неправильно указали специализацию. Нужно вот так:
C++
1
2
template <>
const char* maxn<const char*>(const char**, const int);
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
18.03.2014, 17:00  [ТС]     Поиск самой длинной строки в const char** #9
Спасибо, Ilot!!!!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2014, 17:10     Поиск самой длинной строки в const char**
Еще ссылки по теме:

C++ Переделать функцию поиска самой длинной строки так, чтобы она правильно печатала размер произвольно длинной входной строки и воспроизводила ее
C++ Чем отличаются объявления const char* и const* char
C++ Нахождение самой длинной строки из массива

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
18.03.2014, 17:10     Поиск самой длинной строки в const char** #10
Цитата Сообщение от Ilot Посмотреть сообщение
Нет смысла передавать в функции указатели на встроенные типы.
Это очень контекстно зависимая фраза всё таки. Если используется только чтение единственного значения по указателю, то да, смысла не много. Иначе как минимум может быть полезно для:
- передачи массива (адрес первого элемента);
- возврата значения через запись по переданному адресу.
Yandex
Объявления
18.03.2014, 17:10     Поиск самой длинной строки в const char**
Ответ Создать тему
Опции темы

Текущее время: 21:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru