Замена слов в строке в СИ

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
lyuba_9
Сообщения: 1
Зарегистрирован: 22 фев 2015, 18:36

Здравствуйте, возникла проблема в написание кода.
Нужно написать код программы, пользователь вводит строку со словами и нужно заменит слова с 5 букв на компьютер, а с 4 букв удалить.
Я вот написала код, но проблема в том что у меня вводишь одно слово с 5 или 4 букв и оно заменяется, а если несколько слов то слова не заменяются. Помогите пожалуйста!

Код: Выделить всё

#include <stdio.h>
#include <string.h>
#include <conio.h>

void new_string(char*);

int main()
{
   char S[100];
   printf ("input word:\n");
   gets(S);

   int i = strlen(S);
   if (strlen(S)==4)
   {
      printf(" ");
   }
   else if (strlen(S)==5)
   {
      printf("компьютер");
   }

   getch();
   return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Дело в том, что gets читает в указанный буфер всю строку до перевода каретки. То есть, если пользователь введёт несколько слов через пробел, то в S пападут все эти слова. Очевидно, что в таком случае проверка strlen(S) не будет работать, так как эта функция вернёт длину не слова, а всей строки, содержащей несколько слов.

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

Специальные переменные: ТекущийИндекс, ДлинаСлова : целое

1. Читаем строку.
2. ДлинаСлова присвоить 0.
3. Запускаем цикл по переменной ТекущийИндекс по всем символам прочитанной строки, включая терминирующий ноль:
3.1. Если текущий символ (символ с индексом ТекущийИндекс) равен пробелу или терминирующему нолю, то:
3.1.1. Если ДлинаСлова больше ноля, то:
3.1.1.1. Если ДлинаСлова равна 5, то напечатать "компьютер",
3.1.1.2. Иначе если ДлинаСлова не равна 4, то напечатать символы слова, начиная с индекса (ТекущийИндекс - ДлинаСлова) и оканчавая индексом ТекущийИндекс - 1, затем ещё напечатать пробел.
3.1.1.3. ДлинаСлова присвоить 0.
3.2. Иначе (относится к уcловию в пункте 3.1.).
3.2.1. Увеличить ДлинаСлова на один.
4. Конец программы.

Заметка относительно пункта 3.1.1.2. Печатать символы слова можно циклом по отдельности.

Наверное, потребуются дополнительные сведения по С-шным строкам с терминирующим нолём. Я уже делал краткий ликбез по этой теме. Дабы не повторяться, советую почитать вот тут (третье сообщение).
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить