Все вопросительные предложения вывести отдельно от восклицательных - C (СИ)

Узнай цену своей работы

Формулировка задачи:

ввести строку все вопросительные предложения вывести отдельно от восклицательных. мой код:
#include <stdio.h>
#include <string.h>
#include <conio.h>
 
int main()
{
int i=0,len=0,k=0;
char str[80],str1[80],str2[80];
gets(str);
len=strlen(str);
printf("dlina stroki=%d",len);
puts("\n");
for(i=0;i<len;i++)
{
if(str[i]=='?')
{
k=i;
for(i=0;i<=k;i++)
{
    str1[i]=str[i];
}
for(i=1;i<len;i++)
{
    str[i]=str[i+k];
}
}
else if(str[i]=='!')
{
k=i;
for(i=0;i<=k;i++)
{
    str2[i]=str[i];
 
}
for(i=1;i<len;i++)
{
    str[i]=str[i+k];
}
}
}
puts(str1);
puts(str2);
getch();
}
Если ввести просто вопросительное или восклицательные предложения то все работает,но если вместе то к примеру не выводится либо вопросительные предложения или восклицательные.Помогите пожалуйста(желательно исправьте существующую программу).

Решение задачи: «Все вопросительные предложения вывести отдельно от восклицательных»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main ()
{
    char str[256], str1[256] = {0}, str2[256] = {0};
    char *st, *end, *tp;
 
    printf ("Enter the string: ");
    gets (str);
 
    // Начнем бегать по строке, пока не натолкнемся на ., ? или !
    end = str;
    st = str;
    while (1)
    {
        if (*end == 0) break;                       // Если дошли до конца строки - выходим
        if ((*end == '.') || (*end == '?') || (*end == '!'))
        {
            tp = end;                                                   // Сохраняем указатель на знак предложения
            end++;
 
            // Если это не последняя запись - то ставим разделитель
            if (*end != 0)
                *end++ = 0;
 
            switch (*tp)
            {
            case '?':   strcat (str1, st);
                        strcat (str1, "\n");
                        break;
 
            case '!':   strcat (str2, st);
                        strcat (str2, "\n");
                        break;
 
            default:    break;
            }
            st = end;
        }
        else end++;
    }
 
    printf ("Interrogative sentences:\n%s", str1);
    printf ("Exclamatory sentences:\n%s", str2);
 
    return 0;
}

Объяснение кода листинга программы

  1. В начале программы подключаются необходимые библиотеки для работы со строками и памятью.
  2. В функции main() объявляются три строки: str, str1 и str2, а также указатель st, который будет указывать на текущий символ входной строки, и указатель end, который будет указывать на следующий символ после текущего.
  3. Пользователю предлагается ввести строку.
  4. Затем начинается цикл, который продолжается до тех пор, пока не будет достигнут конец строки или не будет встречен знак вопроса, восклицательный знак или точка.
  5. Если был встречен один из этих знаков, то его позиция сохраняется в переменной tp, а затем происходит переход к следующему символу.
  6. Если это не последний символ в строке, то перед следующим символом ставится разделитель (ноль).
  7. В зависимости от значения tp (то есть от того, был ли встречен знак вопроса, восклицательный знак или точка), в соответствующую переменную (str1 или str2) добавляется строка, начиная с текущего символа и заканчивая последним символом перед знаком предложения.
  8. Затем происходит переход к следующему символу.
  9. После окончания цикла выводятся полученные строки.
  10. Программа завершается возвратом нуля.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5
Похожие ответы