Выполнить удаление из строки слов, содержащих только малые латинские буквы - C (СИ)

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

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

не магу понять почему номера оставленных слов выводится правильно а в строку s2 не записывается либо выводит первое слово а дальше бред???
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<iostream.h>
 
void main()
{
 clrscr();
 char s1[]="KLMKM history American peaple ";
 char *s2;
 
 int i=0,k=0,n;
 s2[i]='\0';
// printf("Vvedite stroku:");
// gets(s1);
 printf("%s\n",s1);
 printf("%s\n",s2);
   for(i=0;i<strlen(s1);i++)
    {
     if(s1[i]==' ' || s1[i]=='\0')
      { n=k;
       for(k;k<i;k++)
    {
     if(s1[k]>='a' && s1[k]<='z')
       {   }
        else
        {
         for(n;n<=i;n++)
         { s2[n]=s1[n]; printf("%d ",n);}
         k=i-1;
         }
    }
       k++;
      }
    }
 printf("\n=%s",s2);
 getch();
}

Решение задачи: «Выполнить удаление из строки слов, содержащих только малые латинские буквы»

textual
Листинг программы
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include <ctype.h>
 
/* вообще-то принято, что main() возвращает int */
void main()
{
   char s1[]="KLMKM history American peaple ", *p;
   char s2[128] = {0};
   int bad, count, len = 0;
 
   for(p = s1; *p; p++) /* идем по строке s1, используя указатель p */
   {
      bad = 1; count = 0; /* bad = 1 - признак наличия только строчных букв */
      while(*p && *p != ' ') /* пока не встретим пробел или не кончится строка */
      {
         count += 1; /* это счетчик букв в слове, чтоб знать, сколько копировать */
         /* проверяем, текущая буква НЕ строчная? Если нет, то слово нужно оставить */
         if(!islower(*p)) bad = 0;
         p++; /* следующий символ */
      }
      if(!bad) /* были прописные буквы? */
      {
         /* тогда копируем последнее слово (и следующий за ним символ) в буфер-результат */
         strncpy(s2 + len, p - count, count + 1);
         len += count + 1; /* длина результата, чтоб знать куда писать продолжение */
      }
   } /* Всё, строка пройдена, в s2 - нет слов, состоящих только из строчных букв */
 
   printf("%s\n", s2);
   getch();
}

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

  1. Включаем необходимые заголовочные файлы для работы со строками и символами.
  2. Указываем, что функция main() возвращает void.
  3. Объявляем переменные:
    • s1 - исходная строка.
    • p - указатель на текущий символ в строке s1.
    • s2 - строка, в которую будут копироваться слова без строчных букв.
    • bad - флаг, который будет меняться в процессе проверки букв в текущем слове.
    • count - счётчик букв в текущем слове.
    • len - длина строки s2.
  4. Запускаем цикл, который проходит по каждому символу в строке s1.
  5. Внутри цикла инициализируем переменные bad и count, а также проверяем, является ли текущий символ пробелом или концом строки.
  6. Если текущий символ не является пробелом или концом строки, то увеличиваем счётчик count и проверяем, является ли текущая буква строчной.
  7. Если текущая буква не является строчной, то устанавливаем флаг bad в 0.
  8. Переходим к следующему символу, используя оператор инкремента.
  9. После прохода по всем символам текущего слова, проверяем значение флага bad.
  10. Если флаг bad равен 0, то это значит, что в текущем слове были прописные буквы, поэтому копируем последнее слово (и следующий за ним символ) в буфер-результат s2, начиная с позиции len и увеличивая len на длину скопированного слова.
  11. После прохода по всем словам в строке s1, выводим результат на экран.
  12. Ждём нажатия клавиши.

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


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

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

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