Выполнить удаление из строки слов, содержащих только малые латинские буквы - 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(); }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы со строками и символами.
- Указываем, что функция main() возвращает void.
- Объявляем переменные:
- s1 - исходная строка.
- p - указатель на текущий символ в строке s1.
- s2 - строка, в которую будут копироваться слова без строчных букв.
- bad - флаг, который будет меняться в процессе проверки букв в текущем слове.
- count - счётчик букв в текущем слове.
- len - длина строки s2.
- Запускаем цикл, который проходит по каждому символу в строке s1.
- Внутри цикла инициализируем переменные bad и count, а также проверяем, является ли текущий символ пробелом или концом строки.
- Если текущий символ не является пробелом или концом строки, то увеличиваем счётчик count и проверяем, является ли текущая буква строчной.
- Если текущая буква не является строчной, то устанавливаем флаг bad в 0.
- Переходим к следующему символу, используя оператор инкремента.
- После прохода по всем символам текущего слова, проверяем значение флага bad.
- Если флаг bad равен 0, то это значит, что в текущем слове были прописные буквы, поэтому копируем последнее слово (и следующий за ним символ) в буфер-результат s2, начиная с позиции len и увеличивая len на длину скопированного слова.
- После прохода по всем словам в строке s1, выводим результат на экран.
- Ждём нажатия клавиши.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д