Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для CovCek
6 / 5 / 8
Регистрация: 23.05.2014
Сообщений: 212

Несколько ошибок при обработке строк

21.12.2014, 22:18. Показов 833. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
При тестировании обнаружил несколько проблем с обработкой строки.
1. не работает с русскими словами. (qwerty - все хорошо, йцукен - не хочет) setlocale стоит.
2. не обрабатывает слова с цифрой.
3. не хочет работать при вводе 1 единственного слова.
4.

Код:
Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <conio.h>
using namespace std;
 
//Разделяем строку на слова и формируем из них вектор
vector<string> split( const string& Str, char Symbol) 
{
  vector<string> ret;
  typedef std::string::size_type stringSize;
  stringSize i = 0;
 
  while( i != Str.size() ) {
      while (i != Str.size() && Str[i] == Symbol){
          ++i;
      }
    
    stringSize j = i;
 
    while (j != Str.size() && Str[j] != Symbol) {
        ++j;
    }
 
    if( i != j ) 
    {
      ret.push_back( Str.substr( i, j-i ) );
      i = j;
    }
  }
  return ret;
}
//проверяем , есть ли повторяющиеся символы в слове
bool replay(const string &Str)
{
    bool re = false;
    for (int i = 0; i < Str.length() - 1; i++)
    {
        for (int j = i + 1; j < Str.length(); j++)
        {
            if (Str[i] == Str[j])
            {
                re = true;
                break;
            }
        }
    }
    return re;
}
//удаляем из вектора слова, в которых есть повторяющиеся символы
vector<string> delete_replays(vector<string> myVec)
{
    for (int i = 0; i < myVec.size(); i++){
        if (replay(myVec[i]) == true){
            myVec.erase(myVec.begin() + i);
        }
    }
    return myVec;
}
//проверяем является ли слово числом
bool is_digit(const string &Str)
{
    bool dig = false;
    int count = 0;
    for (int i = 0; i < Str.length(); i++){
        if (isdigit(Str[i])){
            count++;
        }
    }
    if (count == Str.length()){
        dig = true;
    }
    return dig;
}
//Умножаем первое числовое слово на 10
vector<string> mult_by_ten(vector<string> myVec)
{
    int index;
    for (int i = 0; i < myVec.size(); i++)
        if (is_digit(myVec[i]))
        {
            index = i;
            break;
        }
    myVec[index]= myVec[index] + '0';
    return myVec;
}
 
int main()
{
    system("CLS");
    setlocale(LC_ALL,"Russian");
    string str; /*= "one two three 4 five 6 seven 8 nine ten";*/
    getline(cin, str);
    cout << "Исходная строка: " << str << "\n\n";;
    vector<string> myVec = split(str,' ');
    cout << "Строка, в которой удалены слова, в которых есть повторяющиеся символы: \n";
    myVec = delete_replays(myVec);
    for (int i = 0; i < myVec.size(); i++)
        cout << myVec[i] << " ";
    cout << endl;
    myVec = mult_by_ten(myVec);
    cout << "Первое числовое слово увеличено в 10 раз: \n";
    for (int i = 0; i < myVec.size(); i++)
        cout << myVec[i] << " ";
    cout << endl;
    system("PAUSE");
    return 0;
}


Подскажите кто что знает насчет этих ошибок. Буду весьма благодарен.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.12.2014, 22:18
Ответы с готовыми решениями:

try vs return в обработке ошибок
Скажите пожалуйста, как лучше обрабатывать ошибку: return ... или throw ... ? Если функция типа void Добавлено через 13...

Пустая страница при обработке ошибок сервера
Есть REST на: Java, Maven, TomCat, MySql, Hibernate. Сейчас делаю обработку ошибок сервера 404, 400 и т.д. В файле web.xml добавил: ...

При обработке ошибок с ExceptionMapper(Jersey), не получаю JSON
был создан класс-обработчик ошибок, чтобы можно было бросать в нужном месте exceptions типа RuntimeException. Во время выброса такого...

9
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.12.2014, 10:32
После ввода в 96-й строке текст будет в древней кодировке. Перекодируй с помощью OemToChar().
1
 Аватар для Zazy
47 / 47 / 23
Регистрация: 14.04.2013
Сообщений: 188
22.12.2014, 13:37
Пару замечаний:
в функции
C++
1
vector<string> mult_by_ten(vector<string> myVec)
если мы не находим число, то запись идет по неизвестному индексу.
Лучше прикрутить ссылки
C++
1
vector<string> delete_replays(vector<string> myVec)
Цитата Сообщение от CovCek Посмотреть сообщение
2. не обрабатывает слова с цифрой.
проблема скорее всего (особо не вникал) потому что в функции
C++
1
bool is_digit(const string &Str)
мы проверяем строку полностью на принодлежность к числу
1
 Аватар для CovCek
6 / 5 / 8
Регистрация: 23.05.2014
Сообщений: 212
23.12.2014, 15:09  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Перекодируй с помощью OemToChar().
Подскажи как правильно его применить, где то вычитал что он не присутствует в си шарпе, да и на мсдн все по английски. Что за бред несу. Прошу прошения, перепутал лабы.

Буду благодарен.

Добавлено через 1 минуту
Цитата Сообщение от Zazy Посмотреть сообщение
мы проверяем строку полностью на принодлежность к числу
А мне видимо нужно сделать что бы он строку по символам разбирал, Верно?
0
 Аватар для Zazy
47 / 47 / 23
Регистрация: 14.04.2013
Сообщений: 188
23.12.2014, 16:41
сейчас функция проверяет строку на число если в ней все элементы числа, при строке "9sdafs" результат будет false.
1
 Аватар для CovCek
6 / 5 / 8
Регистрация: 23.05.2014
Сообщений: 212
23.12.2014, 17:23  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Перекодируй с помощью OemToChar().
Попробовал использовать OemToChar(), пишет ошибку.
Цитата Сообщение от Zazy Посмотреть сообщение
сейчас функция проверяет строку на число если в ней все элементы числа, при строке "9sdafs" результат будет false.

Ладно понятно, на как быть например с такой строкой, если по заданию нужно первое число увеличить в 10 раз:
9qwert qaws ededed

третье слово то он уберет без проблем, а вот с цифрой что то не то будет, куда ему дописывать 0, вроде бы не указывал. или если переписать функцию, то там виднее будет, что, куда и как он напишет?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.12.2014, 17:50
OemToChar не работает со string. Нужно сделать копию строки в массив char, перекодировать, затем вернуть назад в string.

Для поиска числа всё проще:
C++
1
2
3
4
5
6
7
8
9
void mult_by_ten(vector<string> &myVec)
{
    for (int i = 0; i < myVec.size(); i++)
        if (is_digit(myVec[i]))
        {
            myVec[i] = myVec[i] + '0';
            break;
        }
}
1
 Аватар для Zazy
47 / 47 / 23
Регистрация: 14.04.2013
Сообщений: 188
23.12.2014, 18:36
Можете выложить условие задачи ?
0
 Аватар для CovCek
6 / 5 / 8
Регистрация: 23.05.2014
Сообщений: 212
23.12.2014, 19:38  [ТС]
Цитата Сообщение от Zazy Посмотреть сообщение
Можете выложить условие задачи ?
Точное условие не помню, примерно так:
Пользователь вводит строку слов, нужно
1-убрать слова с повторяющимися буквами
2- первое число увеличить в 10 раз

как то так
0
 Аватар для Zazy
47 / 47 / 23
Регистрация: 14.04.2013
Сообщений: 188
24.12.2014, 11:21
Прога крашится из-за этой функции, как я уже гвоорил если условие не выполняется мы пишем в неизвестную область памяти.
C++
1
2
3
4
5
6
7
8
9
10
11
12
vector<string> mult_by_ten(vector<string> myVec)
{
    int index;
    for (int i = 0; i < myVec.size(); i++)
        if (is_digit(myVec[i]))
        {
            index = i;
            break;
        }
    myVec[index]= myVec[index] + '0';
    return myVec;
}
Если уже совсем в немоготу
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
using namespace std;
 
//Разделяем строку на слова и формируем из них вектор
vector<string> split( const string& Str) 
{
  vector<string> ret;
  string ss = Str;
  size_t pos1;// = ss.find_first_of(" \t"); // ищет пробел или \t
  do
  {
    pos1 = ss.find_first_of(" \t");
    ret.push_back(ss.substr(0,pos1));
    ss = ss.substr(pos1+1);
  }while(pos1 != string::npos);
  
  
  return ret;
}
//проверяем , есть ли повторяющиеся символы в слове
bool replay(const string &Str)
{
    bool re = false;
    for (size_t i = 0; i < Str.length(); i++)
    {
        for (size_t j = i + 1; j < Str.length(); j++)
        {
            if (Str[i] == Str[j])
            {
                re = true;
                break;
            }
        }
    }
    return re;
}
//удаляем из вектора слова, в которых есть повторяющиеся символы
bool delete_replays(vector<string> &myVec)
{
    bool same_find = false;
    for (size_t i = 0; i < myVec.size();){
        if (replay(myVec[i]) == true)
        {
          same_find = true;
          myVec.erase(myVec.begin() + i);
        }
        else
          i++;
    }
    return same_find;
}
//проверяем является ли слово числом
bool is_digit(const string &Str)
{
    bool dig = false;
    size_t count = 0;
    for (size_t i = 0; i < Str.length(); i++){
        if (isdigit(Str[i])){
            count++;
        }
    }
    if (count == Str.length()){
        dig = true;
    }
    return dig;
}
//Умножаем первое числовое слово на 10
bool mult_by_ten(vector<string> &myVec)
{
  for (size_t i = 0; i < myVec.size(); i++)
  {
    if (is_digit(myVec[i]))
    {
      myVec[i] += '0';
      return true;
      break;
    }
  }
  return false;
}
 
int main()
{
    setlocale(LC_ALL,"Russian");
    string str; // = "one two three 4 five 6 seven 8 nine ten";
    getline(cin, str);
    cout << "Исходная строка: " << str << "\n\n";;
    vector<string> myVec = split(str);
    
    if(delete_replays(myVec))
    {
      cout << "Строка, в которой удалены слова, в которых есть повторяющиеся символы: \n";
      for (size_t i = 0; i < myVec.size(); i++)
        cout << myVec[i] << " ";
      cout << endl;
    }
    
    if(mult_by_ten(myVec))
    {
      cout << "Первое числовое слово увеличено в 10 раз: \n";
      for (size_t i = 0; i < myVec.size(); i++)
        cout << myVec[i] << " ";
     cout << endl;
    }
    return 0;
}


Добавлено через 7 минут
З.Ы. На будующие, это плохая конструкция, вы идете по вектору, допустим 4 раза и если условие выполняется вы удаляете из него элмент, но цикл продолжается и вы идете все равно 4 раза и размер вектора уже уменьшился.
C++
1
2
3
4
5
6
7
8
9
vector<string> delete_replays(vector<string> myVec)
{
    for (int i = 0; i < myVec.size(); i++){
        if (replay(myVec[i]) == true){
            myVec.erase(myVec.begin() + i);
        }
    }
    return myVec;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2014, 11:21
Помогаю со студенческими работами здесь

Ошибка при обработке строк, содержащих апостроф
Привет ребята...у меня простой чат. Когда кто-то пишит сообщение без кавычек...все идет прекрасно. Но, когда кто-то пишит что-то с...

Как получить текст ошибки при обработке строк с множеством пробелов
читал мануал и там написано:&quot;Если файл содержит только код PHP, предпочтительно опустить закрывающий тег в конце файла. Это помогает...

Запись в два столбца значений, получаемых при обработке строк, найденных в файлах по двум ключевым словам
Мой вопрос: Есть команда: FOR /F &quot;tokens=3 delims=&gt;&lt;&quot; %%i in ('findstr &quot;/R250GB&quot; C:\11111\*.XML') do (echo.%%i&gt;&gt;C:\222\kod.txt) Есть...

XNet - получить тело запроса в обработке ошибок
Привет. В документации xNet запрос с обработкой ошибок примерно такой: try { using (var request = new HttpRequest()) {...

[Mono] Ошибка при запуске mono - "Произошла одна или несколько ошибок"
здравствуйте! подскажите пожалуйста как избавиться от этой ошибки? заранее спасибо!


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru