Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2012, 09:51   #1
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию Работа со строками. strtok strrev

Всем привет!
Делаю лабу, и тут столкнулся с проблемой..
алгоритм такой:
1.считываем слово в строке text
2.проверяем есть ли это слово палиндром (анна, дед..) с помощью strrev
если да, то выводим это слово и счеткчик палиндромов ++
3.берем следующие слово

вот само задание
"дана строка слов, которые разделены пробелами, вывести все слова палиндромы и их количество"

вот что написал..
Код:
int main()
{

        int i,k=0;
        char text[1000];
        char temp;
        char *p;
        char *pp;

        cout<<"Vvedite"<<endl;
        cin.getline(text,1000);
        p=strtok(text, " ");

        while(p!=NULL){
        //--------вот тут начинаеться лажа
                cout<<p<<endl;
                pp=*p;
                strrev(p);

                if(pp=p){cout<<"slovo palindrom"<<endl; k++;}

                p=strtok(NULL, " ");

        //----заканчиваеться лажа
        }

        getch();
        return 0;
}
вот как написал но отдельно.. и это работает..
Код:
char c[]="qwerty";
        char cc[]="qwerty";
        strrev(c);

        if(c==cc){
                cout<<"slovo palindrom"<<endl;
        }
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 05.04.2012, 10:25   #2
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
По умолчанию

так надо:
Код:
while(p!=NULL){
                cout<<p<<endl;
                pp=new char[strlen(p)+1];
                strcpy(pp, p);
                strrev(p);

                if(!strcmp(pp, p)){cout<<"slovo palindrom"<<endl; k++;}

                p=strtok(NULL, " ");

        }
Т.е. для pp надо сначала память выделить, и туда p скопировать, а сравнивать строки char* нужно с помощью strcmp(0, если строки равны), ну , или в цикле каждый символ сравнивать с каждым...
monolit111 вне форума Ответить с цитированием
Старый 05.04.2012, 10:35   #3
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

monolit111, большое спасибо!!!
ухх!!! очень классно Вы придумали!! я бы еще долго не догадался до такого..

Код:
pp=new char[strlen(p)+1];
скажите, "+1" это для нулевого байта?

делаю другую лабу.. здание в строке найти кол-во слов, найти самое длинное и убрать все лишние пробелы (чтобы между словами был только один пробел.)

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


Код:
int main()
{

        char text[1500];
        char *ch;
        char *m;
        int i,c=0;

        cout<<"Vvedite ryadok"<<endl;
        cin.getline(text,1500);
        cout<<endl;

        ch=strtok(text," ");
        m=new char[strlen(ch)+1];
        strcpy(m,ch);
        while(ch!=NULL){
                cout<<ch<<endl;
                if(strlen(ch)>strlen(m)){
                        m=new char[strlen(ch)+1];
                        strcpy(m,ch);
                }

                ch=strtok(NULL, " ");
                c++;

        }

        cout<<endl<<"Samoe bolshoe slovo - "<<m<<endl;

        cout<<endl<<"Kol-vo slov - "<<c<<endl;

        getch();
        return 0;
}
Спеши медленно.

Последний раз редактировалось Stilet; 07.04.2012 в 12:37.
asmars вне форума Ответить с цитированием
Старый 05.04.2012, 12:44   #4
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
По умолчанию

+1 это для '\0'
А во втором...
легче создавать новую строку...
например, char[1000], как та, в которую вводишь,
и в цикле проверяй символы, и копируй из text в эту переменную...
Индексы для обоих массивов свои(т.е.
Код:
int j=0; //это индекс для твоей новой строки, пусть ch[1000]
for(int i=0; i<1000; i++) {
//и тут, если символ не пробел, или это первый пробел(логич.можно использовать, или проверять предыдущий символ), то 
ch[j++]=text[i];
if (text[i]=='\0') break;
}
)
В итоге получишь какую-то строку, без лишних пробелов, ее потом скопируешь так, если нужно
Код:
char* new_text=new char[strlen(ch)+1];
strcpy(new_text, ch);
и все...
Это примерная схема, все лень писать)
Кстати, strtok тут не особо нужен, много возни будет, как указано выше-легче..

PS
Это для удаления лишних пробелов я написал))
А длинное слово(сильно не вникал, но примерно так) вроде должен выдавать)
monolit111 вне форума Ответить с цитированием
Старый 05.04.2012, 13:26   #5
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

спасибо)
самое длинное слово оно ищет)

эх.. сегодня весь день проведу за лабами)

оно останавливается на первом пробеле.

Код:
        j=0;
        for(i=0; i<1500; i++){

                if(text[i]!=' ' && text[i-1]!=' '){
                        t2[j++]=text[i];
                }
                //if(text[i]=='\0' && text[i+1]=='\0'){break;}
                if(text[i]=='\0'){break;}
        }
Спеши медленно.

Последний раз редактировалось Stilet; 07.04.2012 в 12:39.
asmars вне форума Ответить с цитированием
Старый 05.04.2012, 16:10   #6
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
По умолчанию

Код:
if(text[i]!=' ' || (text[i]==' ' && text[i-1]!=' ')){
                        t2[j++]=text[i];
                }
                //if(text[i]=='\0' && text[i+1]=='\0'){break;}
                if(text[i]=='\0') break;
monolit111 вне форума Ответить с цитированием
Старый 05.04.2012, 16:25   #7
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

это не решает проблему(
ухх.. уже второй час сижу над этой проблемой!!
что-то мне подсказывает надо менять подход)
возможно в этом цикле надо обрабатывать..
Код:
        while(ch!=NULL){
                cout<<ch<<endl;
                if(strlen(ch)>strlen(m)){
                        m=new char[strlen(ch)+1];
                        strcpy(m,ch);
                }

                ch=strtok(NULL, " ");
                c++;

        }
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 05.04.2012, 16:37   #8
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
По умолчанию

чего то я тебя не пойму...
что не получается?
Специально проверил-пробелы удаляются.
разве что может быть такой случай, если вначале стоят неск.пробелов...тогда это отдельно рассматривать(проверять надо)..

Я вот точно не помню про strtok, но вроде она изменяет строку, и эти операции нужно проводить отдельно(логично было бы сначала удалить пробелы, а затем уже искать самое длинное, как мне кажется)

Последний раз редактировалось monolit111; 05.04.2012 в 16:43.
monolit111 вне форума Ответить с цитированием
Старый 05.04.2012, 17:16   #9
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Код:
int main()
{

        char text[1500];  //--основная строка
        char t2[1500];  //--строка с удаленными  пробелами
        char *ch;
        char *m;
        int i, j=0,c=0;

        cout<<"Vvedite ryadok"<<endl;
        cin.getline(text,1500);
        cout<<endl;

        ch=strtok(text," ");
        m=new char[strlen(ch)+1];
        strcpy(m,ch);
        while(ch!=NULL){
                cout<<ch<<endl;
                if(strlen(ch)>strlen(m)){
                        m=new char[strlen(ch)+1];
                        strcpy(m,ch);
                }

                ch=strtok(NULL, " ");
                c++;

        }

        //--удаление пробелов
        for(i=0; i<1500; i++){

                if(text[i]!=' ' ||text[i]!=' ' && text[i-1]!=' '){
                        t2[j++]=text[i];
                        cout<<t2;
                }
                if(text[i]=='\0'){break;}
        }

        //--вывод результатов

        cout<<t2<<endl;     //--- выводит фигню какуето

        cout<<endl<<"Samoe bolshoe slovo - "<<m<<endl;

        cout<<endl<<"Kol-vo slov - "<<c<<endl;

        getch();
        return 0;
}
оно должно подсчитать кол-во слов, найти самое длинное, и удалить из строки лишние пробелы.(между двумя словами должен остаться один пробел)

может есть какая-то ф-ция чтобы удалить определенный символ из строки??
никак не могу придумать, как удалять лишние пробелы из строки, а потом вывести эту строку.
Спеши медленно.

Последний раз редактировалось Stilet; 07.04.2012 в 12:44.
asmars вне форума Ответить с цитированием
Старый 05.04.2012, 20:17   #10
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
По умолчанию

А ты посмотри, что у тебя после
Код:
while(ch!=NULL){
                cout<<ch<<endl;
                if(strlen(ch)>strlen(m)){
                        m=new char[strlen(ch)+1];
                        strcpy(m,ch);
                }

                ch=strtok(NULL, " ");
                c++;

        }
осталось в text, и все поймешь)
---
Строка то изменяется!)
так что сначала удаляй пробелы, а потом длину узнавай...
ну или создай копию исходной строки, с ней проводи операции для вычисления длин, а у исходной удаляй пробелы-так будет даже лучше, и более правильно..

Последний раз редактировалось monolit111; 05.04.2012 в 21:50.
monolit111 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
strtok Matr1x Общие вопросы C/C++ 5 18.02.2012 20:34
strtok Lotles Общие вопросы C/C++ 4 21.12.2011 21:04
Работа с матрицами (норма матрицы, работа со строками) Neitrosha Помощь студентам 1 26.11.2010 20:19
strtok... Joe_Tribbiani Общие вопросы C/C++ 0 02.05.2010 15:52
си. strtok. RZMTZM Общие вопросы C/C++ 2 05.01.2010 12:59