Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
VergilYamato
3 / 2 / 0
Регистрация: 22.08.2014
Сообщений: 64
#1

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей - C++

22.08.2014, 23:39. Просмотров 651. Ответов 7
Метки нет (Все метки)

Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес наибольшей строки (Стивен Прата - "Язык программирования с++", 8 глава, часть 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
#include<iostream>
#include<cstring>
 
template<typename T> 
int maxn (const char* ar,int n)
{
 
    char max_elem[10];
    int address;
 
    strcpy(max_elem,ar[0]);
 
    for(int i=1;i<n;i++)
        if ( strcmp(ar[i],max_elem)<=0 ) address=i;
        
return &ar[address];
}
 
int main()
{
    int n=4;
    const char* ar3[]={"max","djfk","jsjs","sgad"};
 
    std::cout << "& max of ar3 = " << maxn(ar3,n) << ", 1 elem of max in ar3 is " << *(maxn(ar3,n)) << "\n";
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2014, 23:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей (C++):

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей - C++
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей. Эта специализация...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си) - C++
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе указателя на int нужна звёздочка (*), а...

Различия указателей char* от указателей других типов - C++
Помогите пожалуйста разобраться! Прочитал раздел про указатели и даже вроде бы понял. Что касается указателей на тип int. Но что...

C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char - C++
Есть почти готовое решение,помогите пожалуйста доделать,немного не понимаю #include &lt;cstdlib&gt; #include &lt;iostream&gt; template...

Различные функции, для которых можно создать массив указателей на функции - C++
Придумайте не менее 3-х различных функций, для которых можно создать массив указателей на функции.

Создать массив заданной размерности с помощью функции и указателей - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void z(int *p){ int a; for (int p=a;p&lt;a+*(p-1);p++){ ...

7
NeonLost
Пес войны
75 / 86 / 3
Регистрация: 23.02.2012
Сообщений: 653
22.08.2014, 23:58 #2
у тебя функция возвращает int, а не адрес...а еще бесполезный шаблон над функцией, если его удалить ничего не изменится
1
EVP
390 / 246 / 43
Регистрация: 14.12.2010
Сообщений: 472
23.08.2014, 12:23 #3
Цитата Сообщение от VergilYamato Посмотреть сообщение
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес наибольшей строки (Стивен Прата - "Язык программирования с++", 8 глава, часть 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 "stdafx.h"
 
#include <iostream>
#include <assert.h>
 
template<typename T, int N>                         // <<<---- задаём тип и размер массива
const T* findLongestString(const T*(& _strs)[N])    // <<<---- принимаем массив по ссылке
{
    size_t maxLength = 0;
    const T* maxStr = NULL;
    for (size_t i = 0; i < N; ++i)                  // <<<---- перебираем все строки
    {
        const T* curStr = _strs[i];
        size_t curLength = 0;
        while (curStr[curLength] != 0)
            ++curLength;
        if (maxLength < curLength)                  // <<<---- находим самую длинную строку
        {
            maxLength = curLength;
            maxStr = curStr;
        }
    }
    assert(maxStr != NULL);                         // <<<---- на всякий случай проверяем результат
    //std::cout << maxLength << std::endl;
    return maxStr;
}
 
int main()
{
    const char* strs[] = { "0", "11", "222", "3333", "end" };
    std::cout << "longest string is: " << findLongestString(strs) << "." << std::endl;
    return 0;
}
1
Alex5
1086 / 747 / 116
Регистрация: 12.04.2010
Сообщений: 1,907
23.08.2014, 12:34 #4
Цитата Сообщение от VergilYamato Посмотреть сообщение
Почему не работает
Цитата Сообщение от VergilYamato Посмотреть сообщение
функции, принимающей массив указателей на char
Параметр - массив указателей на char.
C++
1
2
 ... F ( char* ar[], ... );
 ... F2 ( char** ar, ... );
Здесь параметр - массив char.
C++
1
2
 ... G ( char*ar, ... );
 ... G2 ( char ar[], ... ); //  char* ar  эквивалентно  char ar[]
1
VergilYamato
3 / 2 / 0
Регистрация: 22.08.2014
Сообщений: 64
25.08.2014, 20:17  [ТС] #5
У меня вроде массив строк, это разве не то же самое, что и массив указателей на char?

Добавлено через 1 минуту
Зачем ты подключаешь stdafx, и что там?
0
EVP
390 / 246 / 43
Регистрация: 14.12.2010
Сообщений: 472
26.08.2014, 09:32 #6
Цитата Сообщение от VergilYamato Посмотреть сообщение
У меня вроде массив строк, это разве не то же самое, что и массив указателей на char?
Не одно и тоже.
Массив сохраняет количество элементов, а указатель теряет размерность массива.

Цитата Сообщение от VergilYamato Посмотреть сообщение
Зачем ты подключаешь stdafx, и что там?
Это примочка от Visual Studio. В остальных компиляторах stdafx.h не нужен.
//Забыл убрать в коде первую строчку: #include "stdafx.h"
1
Alex5
1086 / 747 / 116
Регистрация: 12.04.2010
Сообщений: 1,907
26.08.2014, 19:50 #7
Цитата Сообщение от VergilYamato Посмотреть сообщение
У меня вроде массив строк
Цитата Сообщение от VergilYamato Посмотреть сообщение
C++
1
char* ar
Параметр char* ar, это то же самое, что char[], массив char. Этот массив содержит только одну строку.
0
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
27.08.2014, 17:38 #8
Что непонятно - спрашивай:
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
#include <iostream>
#include <cstring>
 
using namespace std;
 
char* longestCSTR(char* cstrArray[], size_t cstrCount)
{
    size_t longestIndex = 0;
    for (size_t i = 1; i < cstrCount; ++i)
    {
        if (strlen(cstrArray[i]) > strlen(cstrArray[longestIndex]))
            longestIndex = i;
    }
    return cstrArray[longestIndex];
}
 
int main()
{
    char* Array[] = { 
        "Hello, world!",
        "lorem ipsum dolor sit amet",
        "42",
        "you are null and void",
        "" 
    };
    cout << longestCSTR(Array, 5) << endl;
    cin.get();
}
1
27.08.2014, 17:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2014, 17:38
Привет! Вот еще темы с ответами:

Виртуальные функции (создать массив указателей на объекты трех классов) - C++
Задание: создать массив указателей на объекты трех классов. Метод Show почему-то не переопределяется. В данном коде вводится 3 элемента в...

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей? - C++
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты, для чего используются указатели на...

по поводу указателей. Как правильно задавать массив указателей и его удалять? - C++
Т.е., например создаю указатель: TPoint *p_Point=NULL; а если массив? TPoint *p_MassPoint; //=?; как массив обнулить не ясно ...

Как удалить массив указателей char* - C++
Столкнулся с проблемой при написании деструктора к классу, а именно не получается корректно удалить массив указателей, при удалении выдает...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru