Написал программу для отделения гласных и согласных от строки. Переменная-счетчик добавлена ​​необычным образом

Я написал программу на C, где пользователь вводит входную строку, а программа разделяет гласные и согласные на разные строки и печатает выходные данные, но переменная счетчика не начинается с нуля и увеличивается в последовательном порядке.

Код:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
void append(char string[] , char letter)
{
    char arr[] = {letter , '\0'};
    strcat(string,arr);
}
void checkcon(char letter,char string[] , int counter)
{
    char consonants[] = "bcdfghjklmnpqrstvwxyz";
    for (int i=0;i<=20;i++)
    {
        if (letter == consonants[i])
        {
            append(string,letter);
            counter = counter + 1;
            printf("Con : %d\n",counter);
        }
    }
}
void checkvow(char letter,char string[],int counter)
{
    char vowels[] = "aeiou";
    for (int i=0;i<=4;i++)
    {
        if (letter == vowels[i])
        {
            append(string,letter);
            counter = counter + 1;
            printf("Vow : %d\n",counter);
        }
    }
}
int main(void)
{
    char inp[5000] = {0};
    char vow[5000] = {0};
    char con[5000] = {0};
    int vowno,conno = 0;
    int length;
    printf("Enter a string: ");
    scanf("%s",&inp);
    for (length = 0; inp[length] != '\0'; ++length)
    {
        inp[length] = tolower(inp[length]);
    }
    for (int i=0;i<=length;i++)
    {
        checkcon(inp[i],con,conno);
        checkvow(inp[i],vow,vowno);
    }
    printf("Consonants: %s\n",con);
    printf("Number of consonants: %d\n",conno);
    printf("Vowels: %s\n",vow);
    printf("Number of vowels: %d",vowno);
    return 0;
}

Выход :

Enter a string: String
Con : 1
Con : 1
Con : 1
Vow : 15081
Con : 1
Con : 1
Consonants: strng
Number of consonants: 0
Vowels: i
Number of vowels: 15080

Я не понимаю, почему мой счетчик не начинается с нуля и последовательно не увеличивается.

Я попробовал это со всеми алфавитами, и вот результат:

Enter a string: abcdefghijklmnopqrstuvwxyz
Vow : 15081
Con : 1
Con : 1
Con : 1
Vow : 15081
Con : 1
Con : 1
Con : 1
Vow : 15081
Con : 1
Con : 1
Con : 1
Con : 1
Con : 1
Vow : 15081
Con : 1
Con : 1
Con : 1
Con : 1
Con : 1
Vow : 15081
Con : 1
Con : 1
Con : 1
Con : 1
Con : 1
Consonants: bcdfghjklmnpqrstvwxyz
Number of consonants: 0
Vowels: aeiou
Number of vowels: 15080

Я упомянул об этом , так как использовал цикл for для проверки согласных и гласных вместо функции, но все равно ничего не понял правильно. Мой вопрос сильно отличается от этого и от этого, потому что ни в одном из вопросов не используется отдельная функция для проверки согласных и гласных, и ни в одном вопросе нет более подробной информации о том, как не работает их счетчик.

Проблема заключается в том, почему счетчик не работал. Это было исправлено путем инициализации переменных и присвоения возвращаемого значения функции соответствующим переменным (измените тип возвращаемого значения на int и верните «счетчик» после цикла).

Вы никогда не инициализируете vowno...

Shawn 05.09.2024 15:34
vowno и length оба неинициализированы. Увеличьте количество предупреждений компилятора.
Stephen Newell 05.09.2024 15:34

Когда вы передаете переменную функции (как в foo(var);), все, что функция делает со своим аргументом, не меняет значение переменной в вызывающей функции. Итак, int var = 42; foo(var); printf("%d\n", var); всегда будет печатать 42.

pmg 05.09.2024 15:36

И помните, что C передается по значению. counter = counter + 1; в этих функциях checkcon() и checkvow() не изменяет никакую переменную в вызывающем объекте, как вы видели, думая, что так оно и будет.

Shawn 05.09.2024 15:37
int vowno,conno = 0; ==> int vowno = 0,conno = 0; иначе vowno не инициализируется.
pmg 05.09.2024 15:44

В вашей программе есть несколько ошибок, и нецелесообразно переносить программу в Stack Overflow и ожидать общей помощи по устранению множества ошибок. Вы должны создавать программу по частям. Начните с чтения строки и подсчета гласных, а не с согласных или построения отдельных строк. Пусть это работает. Затем добавьте счет согласных. Затем добавьте построение строки. Таким образом, вы столкнетесь с одной проблемой или, по крайней мере, с меньшим количеством проблем за раз. Это поможет вам понять, что происходит…

Eric Postpischil 05.09.2024 15:45

… Если вы застряли, это также даст вам более узкую проблему, которую можно будет перенести в Stack Overflow, чтобы вы могли задать один конкретный вопрос об одной конкретной проблеме.

Eric Postpischil 05.09.2024 15:45

Касательно того, что сказал @EricPostpischil: разрабатывайте небольшими частями и часто их тестируйте. Не пишите всю программу, а затем тестируйте ее. Тестируйте каждую функцию по мере ее написания. Когда вы знаете, что функция действительно работает, вы можете двигаться дальше и использовать ее, не беспокоясь о скоплении ошибок.

Chris 05.09.2024 17:31

Йо, @nkminion! Ой, мой. Зачем отрицать y из своего "aeiou" подсчета? В этом комментарии «у» всегда является гласной.

chux - Reinstate Monica 05.09.2024 18:22

Прошу прощения за плохую формулировку вопроса.

nkminion 05.09.2024 19:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Синтаксис определения переменных не такой, как вы думаете.

int vowno,conno = 0;

Означает:

int vowno;     // define, but not initialize
int conno = 0; // define and initialize

Если вы хотите определить и инициализировать обе переменные в одной строке:

int vowno = 0, conno = 0;

Это решает только часть проблемы. counter = counter + 1; это не имеет никакого эффекта, поскольку counter — это всего лишь копия значения, переданного в функцию. Он не отображается в вызывающей функции.

Gerhardh 05.09.2024 16:53

Я изменил строки 52 и 53 на это: conno = checkcon(inp[i],con,conno);vowno = checkvow(inp[i],vow,vowno); и теперь это работает, спасибо.

nkminion 05.09.2024 18:58

Другие вопросы по теме