Ваш код содержит две ошибки:
i
и j
индексы функции vowels()
не инициализируются, поэтому они содержат мусор и приведут к непредсказуемому поведению ваших циклов. Это потому, что локальные переменные, в отличие от глобальных переменных, по умолчанию не инициализируются равными 0.
Используйте вместо
int i=0, j=0;
Буфер
char str[x];
не сможет содержать строку с символами x. Фактически, пространство, требуемое символом конца строки
'\0'
.
Так должно быть
char str[x+1];
С этими изменениями ваш код будет работать.
Но ...
... но этого недостаточно. Фактически, когда вы получаете входную строку, вы не выполняете никакой проверки количества полученных символов:
scanf("%s", str);
Вставляя очень длинную строку, вы go выходите за пределы далеко за пределами строки str
, вызывая неопределенное поведение и, вероятно, программу cra sh.
Как это исправить? Поскольку ваша входная строка может иметь максимум длина 9, просто определите массив фиксированной длины :
char str[11];
Почему размер 11? Прежде всего ваш массив должен содержать максимум 9 символов и терминатор. Таким образом, 10. Но он также должен содержать дополнительный символ, чтобы входные данные были длиннее 9 символов.
После этого просто получите входную строку с
scanf("%10s", str);
Таким образом все входные строки le git могут быть сохранены (от размера 1 до размера 9). Все строки длиной 10 или более символов будут усечены до строки длиной в десять символов, и ваша проверка длины завершится неудачно, как и ожидалось.
Обратите внимание, что в случае длинной строки все символы, превышающие первые 10, останутся непрочитанными в stdin
буфер. Так что в случае ошибки вам нужен механизм для потребления этих символов, в противном случае вы найдете их на следующем scanf
. Я написал этот трюк:
while( fgets( str, 10, stdin ) != NULL )
{
if( strlen(str) < 10 )
break;
}
Полученный код со всеми описанными мною изменениями следующий:
#include <stdio.h>
#include <string.h>
int vowels(char str[]);
int main(){
int n, i, x;
printf("How many strings do you want to insert?");
scanf("%d", &n);
printf("How many characters per string?");
scanf("%d", &x);
if(x < 10){
char str[11];
for(i = 0; i < n; i++){
printf("Insert a string:");
scanf("%10s", str);
if(strlen(str) == x){
vowels(str);
}
else{
printf("Error\n");
while( fgets( str, 10, stdin ) != NULL )
if( strlen(str) < 10 )
break;
}
}
}
else{
printf("Error: the number of characters must be < 10");
}
return 0;
}
int vowels(char str[]){
int i=0, j=0;
while(str[i] != '\0')
{
if(str[i] == 'a' || str[i] == 'A' || str[i] == 'e' ||
str[i] == 'E' || str[i] == 'i' || str[i] == 'I' ||
str[i] == 'o' || str[i] == 'O' || str[i] == 'u' ||
str[i] == 'U')
{
j++;
}
i++;
}
printf("Number of vowels in the string:%d\n", j);
return 0;
}