Я написал программу на 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
и length
оба неинициализированы. Увеличьте количество предупреждений компилятора.
Когда вы передаете переменную функции (как в foo(var);
), все, что функция делает со своим аргументом, не меняет значение переменной в вызывающей функции. Итак, int var = 42; foo(var); printf("%d\n", var);
всегда будет печатать 42.
И помните, что C передается по значению. counter = counter + 1;
в этих функциях checkcon()
и checkvow()
не изменяет никакую переменную в вызывающем объекте, как вы видели, думая, что так оно и будет.
int vowno,conno = 0;
==> int vowno = 0,conno = 0;
иначе vowno
не инициализируется.
В вашей программе есть несколько ошибок, и нецелесообразно переносить программу в Stack Overflow и ожидать общей помощи по устранению множества ошибок. Вы должны создавать программу по частям. Начните с чтения строки и подсчета гласных, а не с согласных или построения отдельных строк. Пусть это работает. Затем добавьте счет согласных. Затем добавьте построение строки. Таким образом, вы столкнетесь с одной проблемой или, по крайней мере, с меньшим количеством проблем за раз. Это поможет вам понять, что происходит…
… Если вы застряли, это также даст вам более узкую проблему, которую можно будет перенести в Stack Overflow, чтобы вы могли задать один конкретный вопрос об одной конкретной проблеме.
Касательно того, что сказал @EricPostpischil: разрабатывайте небольшими частями и часто их тестируйте. Не пишите всю программу, а затем тестируйте ее. Тестируйте каждую функцию по мере ее написания. Когда вы знаете, что функция действительно работает, вы можете двигаться дальше и использовать ее, не беспокоясь о скоплении ошибок.
Йо, @nkminion! Ой, мой. Зачем отрицать y
из своего "aeiou"
подсчета? В этом комментарии «у» всегда является гласной.
Прошу прощения за плохую формулировку вопроса.
Синтаксис определения переменных не такой, как вы думаете.
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
— это всего лишь копия значения, переданного в функцию. Он не отображается в вызывающей функции.
Я изменил строки 52 и 53 на это: conno = checkcon(inp[i],con,conno);
vowno = checkvow(inp[i],vow,vowno);
и теперь это работает, спасибо.
Вы никогда не инициализируете
vowno
...