В алфавитном порядке напечатать (по одному разу) все строчные русские буквы, входящие в заданный текст - C (СИ)
Формулировка задачи:
Подскажите ошибку, которую допустила в программе.
Задание такое: Вводится текст, за которым следует точка. В алфавитном порядке напечатать (по разу) все строчные русские буквы, входящие в этот текст. (требуется написать программу на языке СИ)
#include <stdio.h>
#include <malloc.h>
int main() {
char *user_input = malloc(sizeof(char));
char *output = malloc(sizeof(char));
int i = 0;
int d = 0;
int flag = 1;
while (1) {
scanf("%c", &user_input[i]);
if (user_input[i] == '.') {user_input[i]='\0';break;}
for (int j = 0; j < i; i++) {
if (user_input[i] == output[j]) {
flag = 0;
break;
}
}
if (flag) {
output[d] = user_input[i];
d++;
output =(char*) realloc(output, (d + 2) * sizeof(char));
}
flag = 1;
i++;
user_input = (char*)realloc(user_input, (i + 1) * sizeof(char));
}
printf("input %s",user_input);
printf("output %s",output);
char x;
for (int m = 0; m < d; m++) {
for (int j = d - 1; j > m; j--) {
if (output[j - 1] > output[j]) {
x = output[j - 1];
output[j - 1] = output[j];
output[j] = x;
}
}
}
output[d + 1] = '\0';
printf("%s", output);
return 0;
}Решение задачи: «В алфавитном порядке напечатать (по одному разу) все строчные русские буквы, входящие в заданный текст»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#define N 33
void AtLeastOnce(char* );
int main()
{
char buf[BUFSIZ];
setlocale(LC_ALL, "Russian");
system("chcp 1251 > nul");
puts("Введите строку: ");
fgets(buf, BUFSIZ, stdin);
AtLeastOnce(buf);
}
void AtLeastOnce(char* p)
{
int AzBuki[N] = {}, i;
while(*p){
if(*p >= 'а' && *p <= 'я'){
AzBuki[*p - 'а']++;
}
p++;
}
for(i = 0; i < N; i++){
if(AzBuki[i] > 0)
printf("%c ", i + 'а');
}
}
Объяснение кода листинга программы
В этом коде:
- #include
, #include , #include - подключают необходимые для работы функции и определения из заголовочных файлов. - #define N 33 - определяют количество различных букв в русском алфавите (не считая буквы 'ё').
- *void AtLeastOnce(char );** - объявляют функцию с именем AtLeastOnce, которая принимает указатель на строку символов и не возвращает ничего.
- int main() - объявляют основную функцию программы, которая возвращает значение типа int (0 - успешно, 1 - ошибка).
- char buf[BUFSIZ]; - создают массив символов (строку) для ввода текста.
- setlocale(LC_ALL,
Russian); - устанавливают русскую локаль для работы с русским текстом. - system(
chcp 1251 > nul); - устанавливают кодировку консоли ввода в 1251 (кириллица). - puts(
Введите строку:); - выводят приглашение для ввода строки. - fgets(buf, BUFSIZ, stdin); - считывают строку из консоли ввода в массив buf.
- AtLeastOnce(buf); - вызывают функцию AtLeastOnce, передавая ей указатель на введенную строку.
- *void AtLeastOnce(char p)** - функция для перебора всех букв в строке и подсчета их количества.
- int AzBuki[N] = {}, i; - объявляют массив для подсчета количества букв и переменную для цикла.
- *while(p){** - пока не достигнут конец строки.
- if(p >= 'а' && p <= 'я'){ - если текущий символ является буквой русского алфавита.
- *AzBuki[p - 'а']++;** - увеличивают счетчик для соответствующей буквы в массиве.
- p++; - переходят к следующей букве.
- for(i = 0; i < N; i++){ - после перебора всех букв, выводят результат.
- if(AzBuki[i] > 0) - если количество вхождений данной буквы больше нуля.
- printf(
%c, i + 'а'); - выводят букву на экран. - } - завершают цикл.