Проверьте, является ли ввод целым или символом в fgets в C - PullRequest
2 голосов
/ 30 сентября 2019

Я создаю программу, которая принимает строку ввода с клавиатуры, а затем показывает количество согласных в качестве вывода. Мне удалось сделать это нелепым образом в функции count_consonants. Я проверял, используя if statement, является ли каждый символ на входе числом или символом, чтобы игнорировать их во время вычислений. Первоначально я хотел проверить, не является ли строка строкой, используя fgets, но я не знаю как. Это не эффективный способ, так что есть идеи для этого?

#include <stdio.h>
#include <string.h>

//function to calculate the consonants
int count_consonants(char str[]) {
  int idx;
  for (idx = 0; idx < 100; ++idx) {
    if (str[idx] == '\0') {
      break;
    }
  }

  int vowl = 0;

  for (int i = 0; i < idx; ++i) { //loop to check if the characters are vowels or not
    if (str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o'
        || str[i] == 'u' || str[i] == 'A' || str[i] == 'E' || str[i] == 'I'
        || str[i] == 'O' || str[i] == 'U' || str[i] == ' ') {
      vowl += 1;
    }

    // numbers and symbols are counted here as vowels because if not, 
    // the compiler will count them the other way around
    if (str[i] == '1' || str[i] == '2' || str[i] == '3' || str[i] == '4'
        || str[i] == '5' || str[i] == '6' || str[i] == '7' || str[i] == '8'
        || str[i] == '9') {
      vowl += 1;
    }

    if (str[i] == ':' || str[i] == ',' || str[i] == '.' || str[i] == '$'
        || str[i] == '%' || str[i] == '^' || str[i] == '&' || str[i] == '*'
        || str[i] == '#' || str[i] == '_' || str[i] == '!') {
      vowl += 1;
    }
  }

  int cons = idx - vowl; // consonants = whole length of text - vowels
  return cons - 1;
}

int main(int argc, char const *argv[]) {
  char string[100];
  char store[100][100];
  int i = 0;

  while (string[0] != '\n') {
    fgets(string, 100, stdin);
    strcpy(store[i], string);
    i++;
  }
  for (int j = 0; j < i - 1; ++j) {
    /* code */
    printf("Number of consonants=%d\n", count_consonants(store[j]));
  }
  return 0;
}

Ответы [ 2 ]

2 голосов
/ 30 сентября 2019

показывает количество согласных

Простой способ подсчета согласных, используйте isalpha(), strchr()

#include <string.h>
#include <ctype.h>

int my_isavowel(char ch) {
  const char *p = strchr("aeiouAEIOU", ch);  // search for a match
  return p && *p;  // If p is not NULL, and does not point to \0
}

int count_consonants(const char str[]) {
  int count = 0;
  while (*str != '\0') { // while not at end of string ...
    char ch = *str++;    // Get character and advance
    count += isalpha((unsigned char) ch) && !my_isvowel(ch);
  }
  return count;
}
0 голосов
/ 30 сентября 2019

Если вы ищете количество согласных, просто лучше посчитать согласные вместо других вещей

#include <stdio.h>
#include <string.h>

int main (int narg,char*args[]){

    char cons[ ] = "ZRTPQSDFGHJKLMWXCVBN";

    char sentence[ ] = "This is my sentence!";

    int i=0;
    int sum_cons = 0;

    for (i = 0; i < strlen(sentence); ++i)
        if (strchr(cons,strupr(sentence)[i])) sum_cons++;

    printf  ("#CONS>%i\n",sum_cons);

    return 0;
}
...