Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
1

Является ли фраза палиндромом. Указатели.

31.07.2017, 14:45. Показов 3103. Ответов 23

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Решая задачу с палиндромами столкнулся с проблемой,что при изменении данных в одном дочернем массиве, изменяются значения и во всех других ,которые указывают на родительский.
Ох..что-то я непонятно объясняю ...Вот код:
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
65
66
67
68
69
70
71
72
73
74
#include "stdafx.h"
#include <iostream>
#include <cctype>
#include <string.h>  
#include <stdio.h>  
 
 
void words(char*, char** &, int &);
 
char* invert(char* text)
{
    int d = strlen(text);
    for (int i = 0; i < d / 2; i++)
    {
        char temp = text[i];
        text[i] = text[d - (i + 1)];
        text[d - (i + 1)] = temp;
    }
    return text;
}
int _tmain()
{
 
    const unsigned char N = 80;
    char **array_words = (char**)calloc(1, sizeof(char*));
    char **array_words_for_palindroms = (char**)calloc(1, sizeof(char*));
    int str(0), number_words(0),number_words_for_palindoms(0);
    std::cin >> str;
 
    char **array_string = (char**)calloc(str, sizeof(char*));
    for (int count = 0; count < str; count++)
    {
        array_string[count] = (char*)calloc(N + 1, sizeof(char));
    }
    std::cin.get();
 
    for (int i = 0; i < str; i++)
    {
        std::cin.getline(array_string[i], N);//Заполнение массива из входного потока
        words(array_string[i], array_words, number_words);
        words(array_string[i], array_words_for_palindroms, number_words_for_palindoms);
    }
    for (int i = 0; i < number_words; i++)
    {
        if (strcmp(array_words[i], invert(array_words_for_palindroms[i])) == 0)
            std::cout << "Y ";
        else
            std::cout << "N ";
    }
    
    free(array_words);
    free(array_words_for_palindroms);
    for (int i = 0; i < str; i++)
    {
        free(array_string[i]);
    }
    free(array_string);
    getchar();
    getchar();
    return 0;
}
 
void words(char *str, char** &array_of_words, int &start)
{
    char *p;
    p = strtok(str, " .,!\n\0"); // Разделяет строку на слова , с помощью разделителей
    while (p != NULL)
    {
        start++;
        array_of_words = (char**)realloc(array_of_words, start*sizeof(char*));
        array_of_words[start - 1] = p;
        p = strtok(NULL, " .,!\n\0");
    }
}
У меня получается,что значения из двух массивов при переворачивании всегда одинаковы.(Т.к. разбиваю одну и ту же строку,и указатели на слова записываю в массив,а значит при переворачивании изменяется значение в массиве,указывающим на родительский массив).
Не представляю что делать. Можете,пожалуйста,подсказать.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2017, 14:45
Ответы с готовыми решениями:

Является ли число палиндромом
Алгоритм проверки числа должен быть именно такой (так поставили задачу) Но он работает...

Является ли строка палиндромом
Проверить,является ли строка палиндромом. Прокоментируйте строки пожалуйста

Является ли K-ая строка палиндромом?
Дан текст из нескольких строк, введенных с клавиатуры. Определить является ли заданная (k-ая)...

Является ли число палиндромом
Дано натуральное число n (n&gt;=9999). Является ли это число палиндромом (перевертышем) с учетом...

23
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
18.08.2017, 19:04 21
Author24 — интернет-сервис помощи студентам
GbaLog-, здравствуйте! Спасибо за ваше замечание. Я это в книге видел по программированию. Кажется писали, что это в профессиональном стиле так делать. Впредь буду знать, что лучше длину строки указывать Кстати, что лучше по скорости: через терминальный ноль или длину на каждом шаге вычислять?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
18.08.2017, 19:32 22
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Кажется писали, что это в профессиональном стиле так делать.
скорее всего, в книге имелся ввиду не std::string, а char */const char *.
в случае с ними проверка на терминальный ноль должна сработать.
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Кстати, что лучше по скорости: через терминальный ноль или длину на каждом шаге вычислять?
в случае с std::string длину вычислять не надо, она хранится в самом классе(см. std::string::size()).
а как пробегать по всей строке - не имеет большого значения.
это не то место, где надо думать об оптимизации, я считаю.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
18.08.2017, 19:54 23
GbaLog-, std::string обязана заканчиваться терминальным нулем.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
18.08.2017, 21:16 24
Цитата Сообщение от avgoor Посмотреть сообщение
std::string обязана заканчиваться терминальным нулем.
следует указать, что это только начиная с с++11.
в с++03 это было не гарантировано.
(см. разницу между data() и c_str() до с++11.)
0
18.08.2017, 21:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.08.2017, 21:16
Помогаю со студенческими работами здесь

Является ли строка палиндромом
#include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; bool palindrom(char s); int...

Проверка, является ли число палиндромом
Проверить, что данное число читается одинаково слева направо и справа налево.Найдите ошибку ...

Является ли это слово палиндромом.
Дано слово, состоящее только из строчных латинских букв. Проверьте, является ли это слово...

Проверить является ли слово палиндромом
Символьная строка содержит одно слово. Проверить, будет ли оно читаться одинаково справа налево и...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru