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

Неправильная работа Функции strcmp

26.01.2017, 12:51. Просмотров 312. Ответов 11
Метки нет (Все метки)

Здравствуйте,не могу разобраться,почему не работает блок с проверкой на те слова, которые не присутствуют в обеих строках одновременно. Уже пробовал и сравнивать массивы,и с помощью strcmp... не работает
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
//вывести в обратном алфавитном порядке те слова, которые не присутствуют в обеих строках одновременно
 
 
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <cctype>
#include <string.h>
 
using namespace std;
 
int words(char*, char**, int);
 
int _tmain()
{
    SetConsoleCP(1251);//Подключаем
    SetConsoleOutputCP(1251);//Русский язык
 
 
    const unsigned char x = 10;
    const unsigned char N = 80;//Количество символов в строке
    char **arr_text; //массив для текста
    arr_text = (char**)calloc(x, sizeof(*arr_text));
    for (int count = 0; count < x; count++)
    {
        arr_text[count] = (char*)calloc(N, sizeof(*arr_text[count]));
    }
    char *arr_str; // массив для строки
    arr_str = (char*)calloc(N, sizeof(*arr_str));
    char **arr_words; // массив для слов
    arr_words = (char**)calloc(30, sizeof(*arr_words));
    for (int count = 0; count < 30; count++)
    {
        arr_words[count] = (char*)calloc(20, sizeof(*arr_words[count]));
    }
    char **arr_sort; // массив для строки
    arr_sort = (char**)calloc(N, sizeof(*arr_sort));
    char *arr_numbers; // массив для кол-ва слов в строке
    arr_numbers = (char*)calloc(N, sizeof(*arr_numbers));
    for (int count = 0; count < 30; count++)
    {
        arr_sort[count] = (char*)calloc(20, sizeof(*arr_sort[count]));
    }
    int str(0), text(0), k(0);
 
    cout << "Введите количество строк: " << endl;
    cin >> str;
    cout << "Введите текс: " << endl;
 
    for (int i = 0; i <= str; i++)
    {
        cin.getline(arr_str, N);//Заполнение массива из входного потока
        strcpy(arr_text[i], arr_str);//Передача в новый массив 
        k = words(arr_str, arr_words, k);
        arr_numbers[i] = k;
    }
    int flag = 0;
    int j = 0;
 
    for (int i = 0; i < arr_numbers[0]; i++)//Перебор слов в 1 строке
    {
        int flag2 = 0;
        int m = 1;
        if (m < str)
        {
            for (int i1 = arr_numbers[m] - arr_numbers[m - 1] + 1; i1 <= arr_numbers[m]; i1++)//Перебор слов от 2 до N строк
            {
//Блок,который не работает
                if (strcmp(arr_words[i], arr_words[i1]) == 0)
                {
                    flag2 = 1;
                }
 
            }
            if (flag2 == 0)
            {
                flag = 1;
                strcpy(arr_sort[j], arr_words[i]);
                j++;
            }
//---------------------
            m++;
        }
    }
    if (flag == 0)
    {
        cout << "Слов, которые не присутствуют в обеих строках одновременно, нет" << endl;
        getchar();
        getchar();
        return 0;
    }
    else
    {/*сортируем массив слов в обратном алфавитном порядке*/
        for (int i = 0; i < j; i++)
        {
            for (int j1 = i + 1; j1 < j; j1++)
            {
                if (strcmp(arr_sort[i], arr_sort[j1]) < 0)
                {
                    char* temp = new char[j];
                    strcpy(temp, arr_sort[i]);
                    strcpy(arr_sort[i], arr_sort[j1]);
                    strcpy(arr_sort[j1], temp);
                }
            }
        }
        for (int i = 0; i < j; i++)
        {
            cout << arr_sort[i] << endl;
        }
        getchar();
        getchar();
        return 0;
    }
}
 
int words(char *str, char** array_of_words, int start)
{
    char *p;
    int j;
    p = strtok(str, " .,!\n\0"); // Разделяет строку на слова , с помощью разделителей
    for (j = start; p; j++)
    {
        strcpy(array_of_words[j], p);
        p = strtok(NULL, " .,!\n\0");
    }
    return j;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.01.2017, 12:51
Ответы с готовыми решениями:

Строковые С++,неправильная работа функции
Доброго времени,не правильно работает функция zad2,огромная просьба помочь в решении!Заранее...

Неправильная работа функции rand() в c++
Функция rand() при подключении функции srand не через time,а через переменную типа unsigned не...

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

Неправильная работа программы после разбития ее на функции
Ребята, кому не сложно, помогите найти ошибку. При выборе первого кейса меню все хорошо ввожу...

11
Фрилансер
410 / 336 / 105
Регистрация: 06.01.2017
Сообщений: 3,744
26.01.2017, 12:56 2
Sh_a_man, а вы используйте string из C++

http://www.cplusplus.com/reference/string/string/
0
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
26.01.2017, 13:08  [ТС] 3
Цитата Сообщение от FateOri Посмотреть сообщение
string
C++
1
2
3
4
5
6
string str1 = arr_words[i];
                string str2 = arr_words[i1];
                if (str1.compare(str2) == 0)
                {
                    flag2 = 1;
                }
Так тоже не работает ... может я что-то не то делаю
0
Фрилансер
410 / 336 / 105
Регистрация: 06.01.2017
Сообщений: 3,744
26.01.2017, 13:11 4
Sh_a_man, а вы всю программу переписали под C++ или только эту часть?
0
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
26.01.2017, 13:20  [ТС] 5
Цитата Сообщение от FateOri Посмотреть сообщение
всю программу переписали под C++
А зачем мне все переделывать? Если оно работает

Добавлено через 5 минут
Цитата Сообщение от FateOri Посмотреть сообщение
используйте string
Я не знаю,можно ли string еще и использовать в программе...читал здесь,что запрещают как с printf+scanf vs cout+cin
0
Форумчанин
Эксперт CЭксперт С++
8159 / 5007 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
26.01.2017, 13:43 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//вывести в обратном алфавитном порядке те слова, которые не присутствуют в обеих строках одновременно
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
 
int main()
{
    const std::string s1 = "eniki beniki eli vareniki", s2 = "eli eniki apple banana";
    std::istringstream ist1(s1), ist2(s2);
    using input_it = std::istream_iterator<std::string>;
    std::vector<std::string> v1 {input_it(ist1), input_it()}, v2 {input_it(ist2), input_it()}, res;
    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());
    std::set_symmetric_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(res));
    std::reverse_copy(res.begin(), res.end(), std::ostream_iterator<std::string>(std::cout, " "));
}
2
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
26.01.2017, 14:54  [ТС] 7
Цитата Сообщение от MrGluck Посмотреть сообщение
C++
А мой код никак нельзя исправить? Или хотя бы сказать,почему он не работает?
0
Форумчанин
Эксперт CЭксперт С++
8159 / 5007 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
26.01.2017, 15:17 8
Цитата Сообщение от Sh_a_man Посмотреть сообщение
А мой код никак нельзя исправить? Или хотя бы сказать,почему он не работает?
Если честно - в нём муторно разбираться. Вот если вы оставите максимально короткий кусок, воспроизводящий проблему, где данные уже будут занесены (чтобы самому не вводить), тогда мб кто-нибудь и посмотрит.
Все эти k, flag1, flag2, m, str ни о чём не говорят.
1
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
26.01.2017, 15:19  [ТС] 9
Цитата Сообщение от MrGluck Посмотреть сообщение
максимально короткий кусок
Просто всегда пишут: "Покажите весь код"
0
Форумчанин
Эксперт CЭксперт С++
8159 / 5007 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
26.01.2017, 15:22 10
Цитата Сообщение от Sh_a_man Посмотреть сообщение
Просто всегда пишут: "Покажите весь код"
Так пишут если приводят кусок кода, который не компилируется или когда высока вероятность, что ошибка спрятана не в том куске, что выложили.
1
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
26.01.2017, 15:30  [ТС] 11
Цитата Сообщение от MrGluck Посмотреть сообщение
в нём муторно разбираться
А где-нибудь есть ГОСТы по коду?) Я бы тоже хотел узнать как писать код, который многие смогут понять.
0
Форумчанин
Эксперт CЭксперт С++
8159 / 5007 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
26.01.2017, 15:32 12
Цитата Сообщение от Sh_a_man Посмотреть сообщение
Я бы тоже хотел узнать как писать код, который многие смогут понять.
Рецепт прост - "Совершенный код" Макконнелла.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.01.2017, 15:32

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Неожиданное поведение fflush(), неправильная работа функции
Никак не пойму почему код не хочет работать последовательно, так, как я ему указал.Что не так я...

Работа с функцией strcmp
добрый вечер . создала структуру . реализовала почти все условия . нужно вывести на экран...

strcmp в функции ...(про поезда)
Вывод на экран поездов отправляющихся после введённого с клавиатуры времени... Сообственно...

Своя версия функции strcmp()
В книге дано задание, создать свою версию функции strcmp(). Подскажите как можно это реализовать,...


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

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

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