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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 44, средняя оценка - 4.86
FreeJaile
Сообщений: n/a
#1

Набор слов, заданый массивом - C++

29.02.2008, 18:43. Просмотров 5632. Ответов 1
Метки нет (Все метки)

Здраствуйте. Мне нужно задать набор слов, построить любую цепочку из них так, чтобы последняя буква одного слова совпадала с первой буквой последующего(над заданием я ещё не работала, поэтому cheking только для примера приведена). Задаю массив. И как я поняла из всего прочитанного, работать с этим массивом я могу только через указатель... но что-то запуталась(

вот в этой строчке : "if (strncmp (p[i], p[i+1], 1) == 0)" выдает ошибку 'strncmp' : cannot convert parameter 1 from 'char' to 'const char *'
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
const int n = 3;
void cheking (char *p);
 
void main(){
 
    //----------------------------------------------------------массив
    char *word[] = {"one", "two", "three"};
 
    char* p = new char[15];
         for (int i=0; i<n; i++) strcpy(p, word[i]); 
 
    for (i=0; i<n; i++) printf (" word [%d] = %s\n", i+1, word[i]);
 
    cheking (p);
    //-----------------------------------------------------------------
}
 
void cheking (char *p){
    for (int i=0; i<n; i++) {
         if (strncmp (p[i], p[i+1], 1) == 0) {
            printf ("\np[i] = %s p[i+1] = %s\n", p[i], p[i+1]);
            break;
        }
    }
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.02.2008, 18:43     Набор слов, заданый массивом
Посмотрите здесь:

C++ Как удалить заданый символ из строки
Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур C++
C++ Дан набор слов ,разделенных точкой с запятой
Дан набор слов на английском языке, разделенных пробелами.Выбелить в последовательности нечетные слова прописными буквами C++
C++ Функция, получает строку слов и рзделителей, а на выходе имеет массив слов из строки и количество этих слов
C++ Дан набор карточек, на каждой из которых написана буква(среди букв могут быть повторяющиеся) и список слов
Преобразовать полученный текст в набор строк, каждая из которых содержит целое количество слов и ее длинна не превышает 40 символов C++
C++ Массивом и динамическим массивом
C++ Выводить определенный набор слов/словосочетаний в различном порядке
Потоки и прямая запись в заданый std::string C++
C++ Подсчитать количество слов в предложении (слово – это набор символов, разделённых пробелами)
C++ Строка: Подсчитать количество слов, что заканчиваются на заданый символ.

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igor_nf
118 / 12 / 1
Регистрация: 21.08.2007
Сообщений: 222
02.03.2008, 15:07     Набор слов, заданый массивом #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Объясняю популярно, хотя в любой книге это популярно описано, ну что ж, надеюсь мой пост внимут многие, кому непонятна многочисленная возня с указателями.

Код
char *word[] = {"one", "two", "three"};
Объявление массива из трёх указателей каждый из которых указывает на элемент типа char. Инициализация: каждый указатель теперь указывает на массив символов. Теперь ситуация обстоит так:

Код
char *word[0] = "one";
char *word[1] = "two";
char *word[2] = "three";
Строки расположились в секции rodata, посему попытка изменения содержимого памяти по данным указателям приведёт к access violation. Поэтому безопаснее было объявить так

Код
const char *word[] = {"one", "two", "three"};
дабы компилятор уберёг нас от возможности изменения этих данных. Но ближе к сути. Если мы объявляем массив

Код
char arr[LEN];
компилятор автоматически резервирует память для LEN элементов типа char на стеке(локальная память). Любое обращение к имени arr в программе преобразуется в указатель на первый элемент массива. Поэтому теперь изменить содержимое последней ячейки массива мы можем как так

Код
arr[LEN - 1] = 'x';
так и так

Код
*(arr + LEN - 1) = 'x';
Однако мы могли бы вначале сделать такое объявление:

Код
char *arr = "abcdefgh";
Это объявление создаст локальный указатель, который будет указывать на показанную строку, которую компилятор опять же разместит в секции rodata(обратите внимание - в первом случае массив полностью разместится на стёке). Изменить последний элемент массива мы опять же можем как так

Код
arr[LEN - 1] = 'x';
так и так

Код
*(arr + (LEN - 1)) = 'x';
Предполагается, что в данном случае LEN известно: либо задано как константа, либо вычислено в программе. Поскольку количество элементов строки нигде явно не декларируется, можно их посчитать(как - думаем сами).

Таким образом, теперь мы видим, что

Код
arr == &arr[0];
*arr == arr[0];
*(arr + N)) == arr[N];
arr + N == &arr[N];
Обратите внимание, что прибавление к указателю единицы заставляет указатель указывать на следующий элемент указуемого массива(но не на следующий байт).

Это было теоретическое вступление. Теперь ближе к самому вопросу. Поскольку известно что strncmp имеет такой прототип

Код
int strncmp(const char *s1, const char *s2, size_t n);
из всего вышесказанного д/б понятно, что такой вызов невалиден

Код
strncmp (p[i], p[i+1], 1)
поскольку это эквивалентно
Код
strncmp (*(p + i), *(p + i + 1), 1)
т.е. ты передаёшь функции не указатели, а сами элементы массивов, в то время как правильный вызов должен выглядеть так

Код
strncmp (p + i, p + i + 1, 1)
Надеюсь всё ясно.
Yandex
Объявления
02.03.2008, 15:07     Набор слов, заданый массивом
Ответ Создать тему
Опции темы

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