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

Строка. Ошибка С2228. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Prin53
 Аватар для Prin53
2 / 2 / 0
Регистрация: 28.02.2012
Сообщений: 117
10.05.2012, 19:02     Строка. Ошибка С2228. #1
Выдает ошибку
left of '.copy' must have class/struct/union type
left of '.erase' must have class/struct/union type
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    char s1[1000],temp[100],s2[1000];
    int i;
    cout << "\nInput a text: ";
    cin >> s1;
    strcpy(s1,s2);
m:
    for (i = 50; ; i--)
        if (s2[i] == ' ')
        {
            s1.copy(temp,i);
            cout<<temp<<"\n";
            s2.erase(0,i);
            goto m;
        }
    return 0;
}
Что не так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2012, 19:02     Строка. Ошибка С2228.
Посмотрите здесь:

C++ Дан символ С и строка S. Перед каждым вхождением C в строку S вставить строку S. Где ошибка?
дана строка, изображающая целое положительное число. Вывести сумму цифр этого числа. Строка должна вводиться с клавиатуры. C++
строка string и строка char C++
Дана строка символов до точки. Составить программу, проверяющую, является ли данная строка палиндромом, т. е. читается ли она слева направо и справа н C++
Функция sort и ошибка С2228 C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
10.05.2012, 19:14     Строка. Ошибка С2228. #2
char - это не строка, а массив символов, заканчивающийся нулем.
Соотв. методов copy, erase у массива нет.
Если хочется работать со строками из библиотеки STL,
то объявить их надо так
C++
1
string s1,temp,s2;
и strcpy(s1,s2);
надо заменить на
s1=s2;
Prin53
 Аватар для Prin53
2 / 2 / 0
Регистрация: 28.02.2012
Сообщений: 117
10.05.2012, 19:22  [ТС]     Строка. Ошибка С2228. #3
Там еще больше ошибок. К примеру тогда придется вводить посимвольно. Это не дело, там 500 символов может быть. Т.е. копировать массивы строк необходимо в цикле?
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
10.05.2012, 20:55     Строка. Ошибка С2228. #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
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string s1,temp,s2;
    int i;
    cout << "\nInput a text: ";
    char s[100];
    cin.getline(s,99);
    s1=s;
    s2=s1;//думаю это имелось ввиду
m:
    for (i = s2.length()-1;i>0 ; i--)
        if (s2[i] == ' ')
        {
            temp=s1.substr(0,i);
            cout<<temp<<"\n";
            s2.erase(0,i);
            goto m;
        }
        system("pause");
    return 0;
}
Однако, сомнительно, что именно это хотелось.
Уточните, что надо было?
Prin53
 Аватар для Prin53
2 / 2 / 0
Регистрация: 28.02.2012
Сообщений: 117
10.05.2012, 21:03  [ТС]     Строка. Ошибка С2228. #5
Задача: разбить текст на строки по 50 символов, разбиение по пробелу.
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
10.05.2012, 21:06     Строка. Ошибка С2228. #6
Вот код, который выводит фрагменты строки разделенные пробелом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string temp,s2;
    int i;
    cout << "\nInput a text: ";
    char s[100];
    cin.getline(s,99);
    s2=s;
    for (i = 0;i<=s2.length();i++)
        if (s2[i] == ' '|| i==s2.length())
        {
            temp=s2.substr(0,i);
            cout<<temp<<"\n";
            s2.erase(0,i+1);
            i=0;
        }
    system("pause");
    return 0;
}
Prin53
 Аватар для Prin53
2 / 2 / 0
Регистрация: 28.02.2012
Сообщений: 117
10.05.2012, 21:20  [ТС]     Строка. Ошибка С2228. #7
Ага, с примером можно сделать по другому.

Добавлено через 10 минут
Не выходит. Я запутался. Помогите, пожалуйста.
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
10.05.2012, 21:26     Строка. Ошибка С2228. #8
C++
1
2
3
4
5
6
7
if (s2[i] == ' '|| i==s2.length())// Проверяем очередной символ на пробел или на конец строки 
{ 
     temp=s2.substr(0,i); // выделяем подстроку до пробела 
     cout<<temp<<"\n"; 
     s2.erase(0,i+1);  // удаляем подстроку вместе с пробелом 
     i=0;  // начинаем считать сначала 
}
Prin53
 Аватар для Prin53
2 / 2 / 0
Регистрация: 28.02.2012
Сообщений: 117
10.05.2012, 21:28  [ТС]     Строка. Ошибка С2228. #9
Сергей Сергеевич, спасибо, этот код ясен. А я переделываю его под мою задачу.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string temp,s2;
    int i;
    cout << "\nInput a text: ";
    char s[100];
    cin.getline(s,99);
    s2=s;
    for (i = 50;i>=0;i--)
        if (s2[i] == ' '|| i==s2.length())
        {
            temp=s2.substr(0,i);
            cout<<temp<<"\n";
            s2.erase(0,i+1);
            i=50;
        }
    system("pause");
    return 0;
}
Ничего не выводит.
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
10.05.2012, 21:33     Строка. Ошибка С2228. #10
Сделайте цикл вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
int CountChar=0;
for (i = 1;i<=s2.length();i++)
{
        if (s2[i] == ' '|| i==s2.length() || CountChar%50==0) 
        {
            temp=s2.substr(0,i);
            cout<<temp<<"\n";
            s2.erase(0,i+1);
            i=0;
        }
        CountChar++;
}
тогда каждый 50-й символ тоже будет заканчивать слово.
Prin53
 Аватар для Prin53
2 / 2 / 0
Регистрация: 28.02.2012
Сообщений: 117
10.05.2012, 21:43  [ТС]     Строка. Ошибка С2228. #11
Задача: Разбить текст на строки не более 50 символов. И условие, что нельзя разбить на слове. Т.е. разделение - 50-символы до пробела. Вот так.
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
10.05.2012, 22:09     Строка. Ошибка С2228. #12
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
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string temp,s2;
    int i,j;
    cout << "\nInput a text: ";
    char s[201];
    cin.getline(s,200);
    s2=s;
    j = s2.length()>50?50:s2.length();// берем либо 50, либо сколько осталось
    for (i=j;i>=0;i--)
    {
        if(j==s2.length()) // остаток строки<50
        {
            temp=s2.substr(0,i+1);
            cout<<temp<<"\n";
            break;
        }else if (s2[i] == ' ')
        {
            temp=s2.substr(0,i+1);
            cout<<temp<<"\n";
            s2.erase(0,i+1);
            j = s2.length()>50?50:s2.length();//снова берем либо 50, либо сколько осталось
            i=j; // начинаем цикл сначала
        }
    }
    system("pause");
    return 0;
}
Prin53
 Аватар для Prin53
2 / 2 / 0
Регистрация: 28.02.2012
Сообщений: 117
11.05.2012, 19:29  [ТС]     Строка. Ошибка С2228. #13
А что значит вот эта строка?
C++
1
j = s2.length()>50?50:s2.length()
Откуда такой синтаксис?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2012, 21:21     Строка. Ошибка С2228.
Еще ссылки по теме:

Дана строка символов. Проверьте,является ли данная строка палиндромом C++
Ошибка, где подчеркнутая строка C++
Даны строка S, символ C и строка S0. Необходимо после каждого вхождения символа C в строку S вставить строку S0 C++

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
11.05.2012, 21:21     Строка. Ошибка С2228. #14
Тернарный оператор присваивания.
Означает, проверить истинность выражения s2.length()>50,
если да, то j=50, иначе j= s2.length()
Yandex
Объявления
11.05.2012, 21:21     Строка. Ошибка С2228.
Ответ Создать тему
Опции темы

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