@artegav
студент

Как вывести символы из строки?

Всем привет! Прошу помощи, дали такое задание: "Программа, которая читает строку длиной до 20 символов от пользователя (необходимо выяснить, не превышает ли строка заданную длину, если да, то нужно ввести заново), подсчитывает и перечисляет количество гласных, согласных, знаков препинания, чисел и других символов (через запятую). Пример: слово Auto, гласные: 3 - A, u, o и т. д." .
Код на поиск и подсчет гласных, согласных и т.д. уже есть. Не знаю как теперь вывести все посчитанные символы из строки, и как поставить условие что, если строка больше 20 символов, то надо ввести ее заново? Помогите пожалуйста.
#include <stdio.h>
#include <string.h>
#define N 21
int main(){
    char str[N];
    const char vovels[]="eyuioaEYUIOA";
    const char consonants[]="qwrtpsdfghjklzxcvbnmQWRTPFGHJKLZXCVBNM";
    char digits[]="0123456789";
    const char punctuation[]=".,:;!?\"()-";
    const char symbols[]="@#$%^&*{}[]<>_+=\'¹%|\\/`~";
    const char spaces[]=" ";
 
    int v, c, d, p, s, sp;
    v = c = d = p = s = sp = 0;
 
    printf("Enter a string no more than 20 symbols :\n\n");
    gets(str);
 
    for (int i=0; str[i] != '\0'; i++)
 
       if (strchr(vovels,str[i])) v++;
       else if (strchr(consonants,str[i])) c++;
       else if (strchr(digits,str[i])) d++;
       else if (strchr(punctuation,str[i])) p++;
       else if (strchr(symbols,str[i])) s++;
       else if (strchr(spaces,str[i])) sp++;
 
    printf("\nVowels: %d\n", v);
    printf("\nConsonants: %d\n", c);
    printf("\nDigits: %d \n", d);
    printf("\nPunctuation: %d\n", p);
    printf("\nSymbols: %d\n", s);
    printf("\nSpaces: %d\n", sp);
 
    return 0;
}
  • Вопрос задан
  • 489 просмотров
Пригласить эксперта
Ответы на вопрос 2
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
man strlen (и даже неудобно такое писать - strlen() - это одна из первых строковых функций :) )
man calloc

Для перечисления нужно завести отдельные массивы и копировать туда символ если условие сработало. А потом этот массив просто вывести.

Кроме того, статические массивы - зло, память надо брать динамически. Код я не привожу намеренно, потому что Вы учитесь и Ваше обучение и состоит в изучении того, какие есть строковые функции а не в копипастинге. Как основа эта программа годится. Но в ней нужно:
- заменить статическую память на динамическую
- после чтения строки проверить ее длину, если она > 20 - спросить заново, что нас естественно приводит к тому, что запрос будет делаться в бесконечном цикле
- в разборочном if не только крутить нужные счетчики, но и копировать символ в соответствущий массив.
- после окончания разбора вывести все отобранные массивы.
Ответ написан
Комментировать
@Wundarshular
Прежде всего настоятельно рекомендую сначала ознакомиться с основами языка, а также используемыми вами функциями ввода вывода. Язык С очень прост: если вы хотите выстрелить себе в ногу, вы стреляете.

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

#define N 21
...
char str[N];
printf("Enter a string no more than 20 symbols :\n\n");
gets(str);


А вот здесь вы наивно надеетесь, что у строки точно есть конец.
for (int i=0; str[i] != '\0'; i++)

Язык С очень прост: если вы хотите считать строку, вы её считаете. Но какой вы её получите - это ваша проблема.

Что до вашей задачи, то, полагаю, самым простым способом в вашем случае будет цикл в цикле: главным циклом вы проходитесь по полученной строке, побочными циклами ищите совпадения в ваших справочниках (массивы vovels и тд) и при нахождении оного либо выводите сразу, либо копируете символ куда-либо для вывода позже.
Вы значительно упростите код в этой части, если посмотрите таблицу ASCII.
Задача ограничения длины решается, например, чтением справочника языка - all-ht.ru/inf/prog/c/func/fgets.html - или просто бесцеремонным обрубанием введённой строки. Для принуждения повторного ввода, думаю, вам подойдёт while либо do while - что больше нравится.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы