Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
6 / 5 / 1
Регистрация: 20.12.2020
Сообщений: 92

Нуль-терминатор мешает сравнению строк

21.06.2021, 00:48. Показов 1300. Ответов 5

Студворк — интернет-сервис помощи студентам
В задаче нужно поменять местами первую и последнюю букву каждого слова, потом найти последнее слово и вывести на экран слова с ним не совпадающие. Всё сделал, но когда я заполняю массив последнего слова, если я не поставлю нуль-терминатор появляется мусор. Но сам нуль терминатор мешает при сравнении строк (strcpy), он увеличивает длину last_slovo на 1, как решить эту дилемму?
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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
 
 
int main()
{
    char text[] = "tesy for c++ project,I hope nython this code python will work,c++ harder than python";
    int first_symbol = 0;
    int last_symbol = 0;
    int last_probel = 0;
    for (int i = 0; i < strlen(text); i++)
    {
        if (text[i] == ' ' || text[i] == ',' || text[i] == '.')
        {
            text[first_symbol] = text[last_symbol];
            first_symbol = i+1;
            last_probel = i;
        }
        else if (i == strlen(text)-1)
        {
            text[first_symbol] = text[strlen(text) - 1];
        }
        else
        {
            last_symbol = i;
        }
    }
    char* last_slovo = new char[strlen(text) - last_probel - 1];
 
 
 
    for (int i = last_probel,j = 0; i < strlen(text); i++,j++)
    {
        last_slovo[j] = text[i];
    }
    last_slovo[strlen(text) - last_probel ] = '\0';
    cout << last_slovo;
 
    char* slovo = strtok(text, " ,.-");
 
    while (slovo != NULL) 
    {
            if (strcmp(slovo, last_slovo) != 0)
            {
                cout << slovo  <<  " ";
            }
        slovo = strtok(NULL, " ,.-");
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.06.2021, 00:48
Ответы с готовыми решениями:

Динамический ввод и нуль терминатор
Надо ввести число i, а потом ввести в строку i символов. Насколько я понимаю, что если я ввожу 6, то создается массив, где вводятся...

Длина строки и нуль-терминатор
Всем привет. Выполняю небольшую лабораторную на строки, давно не занимался! что-то забыл:), что-то и так не знал. такой вопрос. есть...

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

5
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
21.06.2021, 01:59
Для начала, у вас исходный текст задан не по правилам правописания. То есть, после любого знака пунктуации должен стоять пробел. У вас в тексте пробела нет, поэтому не до конца понятна задача. Толи заменять знаки пунктуации на пробел, толи добавлять недостающий пробел в строку, или оставлять пунктуацию как есть?
Отсюда вытекает неопределенность изменения, например:
work,c++ - если считать это как одно слово, тогда при замене символов(первого и последнего) слово должно выглядеть так:
+ork,c+w

Хотя по правилам и логике должно быть два слова, а результат изменения будет выглядеть так: work,c++ = korw, ++c

Так как вам все таки нужно?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13182 / 6818 / 1821
Регистрация: 18.10.2014
Сообщений: 17,255
21.06.2021, 02:15
Цитата Сообщение от Bacchus Посмотреть сообщение
C++
1
2
3
4
#include <iostream>
using namespace std;
 
char* last_slovo = new char[strlen(text) - last_probel - 1];
Это форум по языку С. Что это здесь делает?

Цитата Сообщение от Bacchus Посмотреть сообщение
Но сам нуль терминатор мешает при сравнении строк (strcpy),
Какое отношение strcpy имеет к сравнению строк???
1
6 / 5 / 1
Регистрация: 20.12.2020
Сообщений: 92
21.06.2021, 09:30  [ТС]
Цитата Сообщение от мама Стифлера Посмотреть сообщение
Отсюда вытекает неопределенность изменения, например:
work,c++ - если считать это как одно слово, тогда при замене символов(первого и последнего) слово должно выглядеть так:
+ork,c+w
Хотя по правилам и логике должно быть два слова, а результат изменения будет выглядеть так: work,c++ = korw, ++c
Здравствуйте, я поставил условие через или, в котором срабатывает изменение первой буквы.
Цитата Сообщение от Bacchus Посмотреть сообщение
if (text[i] == ' ' || text[i] == ',' || text[i] == '.')
Моё окно вывода если я выведу текст сразу после первого цикла:
Code
1
yesy ror +++ troject,I eope nython shis eode nython lill kork,+++ rarder nhan nython
Я бы мог поставить пробел и запятую вместе, убрав запятую из условия, но тогда бы получилось ,ork, вместо kork

Добавлено через 5 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это форум по языку С. Что это здесь делает?
Сам не понял, как я закинул этот пост в C
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какое отношение strcpy имеет к сравнению строк???
Согласен, никакого. Хотел написать strcmp

Добавлено через 21 минуту
По итогу вместо 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
    while (slovo != NULL)
    {
        if (strlen(slovo) == strlen(last_slovo) - 1)
        {
            for (int i = 0; i < strlen(slovo); i++)
            {
                if (slovo[i] == last_slovo[i])
                {
                    counter++;
                }
            }
            if (counter != strlen(slovo))
            {
                cout << slovo << " ";
            }
            counter = 0;
        }
        else
        {
            cout << slovo << " ";
        }
        slovo = strtok(NULL, " ,.-");
    }
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
21.06.2021, 14:12
Цитата Сообщение от мама Стифлера Посмотреть сообщение
Для начала, у вас исходный текст задан не по правилам правописания. То есть, после любого знака пунктуации должен стоять пробел. У вас в тексте пробела нет, поэтому не до конца понятна задача. Толи заменять знаки пунктуации на пробел, толи добавлять недостающий пробел в строку, или оставлять пунктуацию как есть?
Цитата Сообщение от Bacchus Посмотреть сообщение
Здравствуйте, я поставил условие через или, в котором срабатывает изменение первой буквы.
вы так и не поняли мой посыл, сделал по вашему методу
C++
1
2
3
4
5
6
7
8
9
10
11
12
char str[] = "tesy for c++ project,I hope nython this code python will work,c++ harder than python";
char slovo[30], *s2, tmp;
s2 = strtok(str, " ,");
while(s2 != NULL)
{
    sscanf(s2, "%[^.,?! ]s", slovo);
    tmp = slovo[strlen(slovo)-1];
    slovo[strlen(slovo)-1] = slovo[0];
    slovo[0] = tmp;
    printf("%s ", slovo);
    s2 = strtok(NULL, " ,");    
}
0
6 / 5 / 1
Регистрация: 20.12.2020
Сообщений: 92
22.06.2021, 18:46  [ТС]
Цитата Сообщение от мама Стифлера Посмотреть сообщение
вы так и не поняли мой посыл
Теперь понял вас, вы про то, что тот же Word будет ругаться на то, что у меня нет пробела после запятой. Я уже сдал программу, но сразу поняв ваше замечание, я бы попробовал немного изменить сравнение i элемента с знаками пунктуации или пробела:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
       if ((str[i] == ",") || (str[i] == ".") && (str[i+1] == " ")
         {
            text[first_symbol] = text[last_symbol];
            first_symbol = i + 2;
            last_probel = i+1;
         }
       else if (i == strlen(text) - 1)
        {
            text[first_symbol] = text[strlen(text) - 1];
        }
        else
        {
            last_symbol = i;
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.06.2021, 18:46
Помогаю со студенческими работами здесь

Ошибка при делении нуль на нуль
Всем привет! Имеется функция которая вычисляет математическое уравнение введённое в поле Edit. Всё нормально работет. Если производится...

Для матрицы S(m,n), 1 < (m, n) < 10, напечатать номера строк, в которых есть хотя бы один нуль
Для матрицы S(m,n), 1 &lt; (m, n) &lt; 10, напечатать номера строк, в которых есть хотя бы один нуль.

Дана матрица целых чисел NxM. Количество строк N и столбцов М задается пользователем. Определить, есть ли нуль в матрице
Дана матрица целых чисел NxM. Количество строк N и столбцов М задается пользователем. Определить, есть ли нуль в матрице. Если есть,...

Терминатор
Перед отправкой Терминатора Т-800 в прошлое для спасения Джона Коннора (события 2 части) обнаружилось, что при анализе текстовых...

Терминатор: Генезис
Imho, фильм неплохой, но на 3-м можно было бы и остановиться.


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru