задача на строки

  • Автор темы CRESTEEN
  • Дата начала
C

CRESTEEN

#1
Нужна помощь опытных людей) Ребят) задали задачку) я вроде решила) но компилятор ругается и выдает ошибку((

вот сама задача

Подсчитать во введенной строке, сколько раз встречается пара символов 'mo'. Каждый символ исходной строки, стоящий сразу за этой парой, поменять на знак '!'. Утверждается, что во введенной строке не может присутствовать 'momo'

вот мой код

#include<conio.h>
#include<iostream.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main(){
clrscr();
char s[255];
cin>>s;
int k=0,b=0;
for (int i=0;i<strlen(s)-3;i++){
if ((s=="m")&&(s[i+1]=="o")&&(s[i+2]=="m")&&(s[i+3]=="o")){b=-1;break;
}}
if (b==-1)cout<<"momo found"; else
{for (i=0;i<strlen(s);i++){
if ((s=="m")&&(s[i+1]=="o"))k++;
}
cout<<"amount of mo found is "<<k;
}
return 0;}

ошибку выдает

cannot convert 'char' to 'char *' d первом IF перед двойным равно...и не понимаю что это означает. Не могли бы вы объяснить в чем ошибка?
 
R

Rififi

#2
CRESTEEN

а этот здесь зачем?

strlen(s)-3

что будет, если я веду строку из двух символов? цикл от 0 до -1? :eek:
в принципе, можно итак оставит, но тогда скрести пальцы, чтобы препод не докопался.

cannot convert 'char' to 'char *' d первом IF перед двойным равно...и не понимаю что это означает.

это значит, что ты пытаешься сравнивать символ и строку, а это не кошерно.
символы в C++ дожны записываться в одинарных кавычках, а не двойных

ну и напоследок, вот такой ввод:

cin >> s

добавит в s символы до первого пробела. то есть из введенной строки "Петя любит Машу" получится только Петя.
если хочешь с пробелами, надо использовать getline
 
C

CRESTEEN

#3
Rififi

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

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#4
а что такого в использовании strlen?
В использовании ничего страшного. Он имел в виду, что, если пользователь введет строку из всего двух символов, то цикл выполняться не будет.
Но, как мне кажется, это корректно алгоритмически. Там идет проверка наличия "momo" последовательности, а, если длинна строки меньше 4 символов, то проверка не требуется.
Хотя, более наглядной будет проверка длинны, например:
C++:
if (strlen(s) >= 4) {выполнить поиск momo}
В некоторых случаях такое можно принять за излишество. Но на этапе обучения, имхо, полезно.

А вот цикл далее
C++:
for (i=0;i<strlen(s);i++){
if ((s[i]=="m")&&(s[i+1]=="o"))k++;
}
по-идее, получит ошибку времени выполнения, в случае, если длинна строки 1 символ, т.к. будет попытка обращения к области за строкой. Хотя, может в C++ этот момент как-то иначе сработает, нежели в паскале и т.п.
 
X

xparen

#5
===============================================
Подсчитать во введенной строке, сколько раз встречается пара символов 'mo'. Каждый символ исходной строки, стоящий сразу за этой парой, поменять на знак '!'. Утверждается, что во введенной строке не может присутствовать 'momo'
===============================================
Исправил все ошибки в вашем коде. Не нашел правда места, где вы вставляете ! знаки после mo =) Если ничего не выйдет пишите, будем решать=)))
C++:
#include <conio.h> // библиотека для getch() (задерживает результат на экране после выполнения)
#include <iostream.h> //библиотека для ввода/вывода 
#include <string.h> //библиотека для работы со строками

int main(){

char s[255];
int k=0,b=0;
puts("Vvedite stroky ");
gets(s);	//изменил ввод строки

if(strlen(s)>=4){ //добавил проверку возможности поиска momo в строке (иначе вылезла ошибка, если введешь строку из 3 и менее символов)
for(int i=0;i<strlen(s)-3;i++){
if ((s[i]=='m')&&(s[i+1]=='o')&&(s[i+2]=='m')&&(s[i+3]=='o')){ // исправил ошибку (ковычки одинарные)
b=-1;
break;
}
}
}
if(b==(-1))
puts("momo found");
else{
for(int i=0;i<strlen(s)-1;i++){ // исправил strlen(s) на strlen(s)-1 дабы не вылазила ошибка о неожиданном конце строки
if((s[i]=='m')&&(s[i+1]=='o'))
k++;
}
printf("amount of mo found is %d", k); // изменил вывод (вместо cout) кол-ва одинарных mo
}
getch(); //добавил задержку результата на экране (чтобы не пропадал после выполнения программы)
return 0;
}
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#6
иначе вылезла ошибка, если введешь строку из 3 и менее символов) for(int i=0;i<strlen(s)-3;i++){
интереса ради, а что в Цпп указанный цикл сработает хотя бы раз при входном параметре длинной <=3 символов?
т.е. при i=0 выражение i<0 равно true? О.о
 
C

CRESTEEN

#7
Akupaka

спасибо за обьяснения) потихоньку начинаю разбираться))

Добавлено: xparen

Спасибо за исправления ошибок и разъяснения) ттолько компилятор ругается) и выдает ошибочку типа Function 'puts' should have a prototype
почему?(
 
X

xparen

#8
интереса ради, а что в Цпп указанный цикл сработает хотя бы раз при входном параметре длинной <=3 символов?
т.е. при i=0 выражение i<0 равно true? О.о
плохо ты читаешь текст, убедился в этом 2 раз.... ключевое слово в строке, которую ты не правильно цитировал, ДОБАВИЛ...
раньше выражения if(strlen(s)>=4) не было...и уже в том случае компилятор ругаться бы начал
З.Ы. сор если показался грубым...

Добавлено:
выдает ошибочку типа Function 'puts' should have a prototype
почему?(
Я не крутой "прогер", но вы случайно не забыли включить библиотеки
C++:
#include <conio.h> // библиотека для getch() (задерживает результат на экране после выполнения)
#include <iostream.h> //библиотека для ввода/вывода 
#include <string.h> //библиотека для работы со строками

// возможно не хватает библиотеки, хотя у меня работает без неё 
#include<stdio.h>
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#9
Надеюсь ТС не против, если мы тут немного пообщаемся ;)

плохо ты читаешь текст, убедился в этом 2 раз.... ключевое слово в строке, которую ты не правильно цитировал, ДОБАВИЛ...
раньше выражения if(strlen(s)>=4) не было...и уже в том случае компилятор ругаться бы начал
Чесгря, не понимаю где я плохо читаю? )) Почему же я неправильно цитировал, и как ты вообще можешь знать правильно ли я цитировал, если это я цитировал? ;) Скорее мы на разных волнах, и ты не совсем верно понял суть моего вопроса. Может даже я некорректно его задал.
А цитировал я именно то, на что желал обратить внимание. Понятно, что ты добавил тот условный оператор и его ранее не было, ведь постом ранее я предложил такую же проверку выполнить ;) И ты даже подписал почему, и вот именно к объяснению у меня появился вопрос :) На который ты, меж прочим, ответа не дал, а зачем-то увязался к другой части кода.
И вообще, на что там компилятор мог ругаться? Может ошибка времени исполнения была, все же? Ну, это как бы лучше не путать. А раз ты мне уже репу подкрасил "за некую принципиальность" ))) то я уж буду принципиален )))
Я был бы рад получить ответ на свой предыдущий вопрос! )

Зато неплохо компилирую в уме ;)
 
C

CRESTEEN

#10
xparen
спасибо за подсказку) а можно вопрос?)) у тебя компилятор не нашел ошибок и программа работала?))
 
X

xparen

#11
xparen
спасибо за подсказку) а можно вопрос?)) у тебя компилятор не нашел ошибок и программа работала?))
Опять же повотрюсь=) у меня в моем первозданном виде работает и компилируеться нормально. Я не великий "прогер"... Но, возможно, разные компиляторы... по разному требуют чего-то=) это просто мои догадки=)))

Добавлено:
Зато неплохо компилирую в уме ;)
Я не сомневаюсь в твоих способностях к программированию........ Давай оставим неприязни где-то там, ибо правильно тобой подмечено ".. видимо мы говорим на разных языках..." ....и не будем оффтопить =)
 
C

CRESTEEN

#12
xparen
огромное спасибо за помощь)))))))) :)

Добавлено: xparen

а еще вопросик) он у меня после BREAK пишет EXPRESSION SYNTAX это что такое? ;)
 
C

CRESTEEN

#13
xparen

ой) все) спасибо) работает) эт у меня руки кривые))))))))))))))