Как мы можем получить подстроку гласного из данной строки - PullRequest
0 голосов
/ 28 января 2019

Я хочу получить все подстроки гласных из заданной строки.Данной строкой является ' auiouxaeibaou ', получить подстроки из указанной строки, например [ auiou , aei , aou ].

Здесь я попробовал что-то подобное, но не получил точного результата.

bool isVowel(char c) {
    return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
}

void substr(char str[], int low, int high)
{
    printf("%.*s \n\n ", high-low+1, (str+low));
}

int main(int argc, const char *argv[]) {

    char str[] = "aeixae";

    int length = strlen(str);

    int start_index = 0, end_index = 0;

    for (int x=0; x<length; x++) {
        char c  = str[x];
        if (isVowel(c) == false) {
            end_index = x;
            substr(str, start_index, end_index - 1 );
            start_index = end_index + 1;
        }

    }
    return 0;
}

Ответы [ 5 ]

0 голосов
/ 28 января 2019

Альтернативный подход:

strspn(), strcspn() - лучшие инструменты здесь. @ Джем Тейлор

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

int main(void) {
  char str[] = "aeixae";
  const char *s = str;
  while (*(s += strcspn(s, "aeiou")) != '\0') { // skip letters that are not aeiou
    size_t len = strspn(s, "aeiou");            // find length made up of aeiou
    printf("<%.*s>\n", (int) len, s);           // print sub string
    s += len;
  }
}

Выход

<aei>
<ae>
0 голосов
/ 28 января 2019

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

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

int isVowel(char c){
    if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'){
        return 1;
    }
    else{
        return -1;
    }
}

int main()
{       
   char my_str[] = "auiouxxxxxxaeibaou";

   int todo_newline = 1; // prevent consecutive newlines

   for(int i = 0; my_str[i] != '\0'; i++){
       if(isVowel(my_str[i]) == 1){
           printf("%c", my_str[i]);
           todo_newline = 1; 
       }
       else{
           if(todo_newline == 1){ // print one newline
               printf("%c", '\n');
               todo_newline = -1; // don't print consecutive newlines
           }
       }
   }
}
0 голосов
/ 28 января 2019

ваша попытка была близка.Я просто добавил включения и убедился, что последняя часть строки также была напечатана.См. Завершение цикла for и if, где вы проверяете гласную.

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

bool isVowel(char c) {
    return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
}

void substr(char str[], int low, int high)
{
    printf("%.*s \n\n", high-low+1, (str+low));
}

int main(int argc, const char *argv[]) {

    char str[] = "aeixae";

    int length = strlen(str);

    int start_index = 0, end_index = 0;

    for (int x=0; x<=length; x++) {
        if (x == length || !isVowel(str[x])) {
            end_index = x;
            substr(str, start_index, end_index - 1 );
            start_index = end_index + 1;
        }

    }
    return 0;
}

, и это вывод:

gcc main.c && ./a.out 
aei 

ae 
0 голосов
/ 28 января 2019

, но не получается точный вывод.

почему у вас нет ожидаемого результата:

  • вы пропустите последнюю последовательность гласных, чтобыпросто замените for (int x=0; x<length; x++) на for (int x=0; x<=length; x++), потому что нулевой символ не является гласным (что не приводит к несанкционированному доступу)
  • , если у вас есть несколько последовательных не гласных, которые вы вызываете в любом случае substr, чтобы избежать необходимостидля запоминания, если раньше был или нет гласный

Изменения дают это (я изменил входную строку):

bool isVowel(char c) {
    return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
}

void substr(char str[], int low, int high)
{
    printf("%.*s \n\n ", high-low+1, (str+low));
}

int main(int argc, const char *argv[]) {
  char str[] = "aeixaewwii";

  int length = strlen(str);

  int start_index = 0, end_index = 0;
  bool wasVowel = false;

  for (int x=0; x<=length; x++) {
    char c  = str[x];
    if (isVowel(c) == false){
      end_index = x;
      if (wasVowel)
        substr(str, start_index, end_index - 1 );
      start_index = end_index + 1;
      wasVowel = false;
    }
    else
      wasVowel = true;
  }

  return 0;
}

Кстати: «у» для меня гласный,Вы пропустили это в isVowel ()

0 голосов
/ 28 января 2019
  1. Хорошая программа.Не забудьте использовать size_t в качестве правильного типа, возвращаемого strlen().
  2. . Ну, если вы хотите, чтобы ввод был auiouxaeibaou, вам нужно вставить его в char str[] = "aeixae";
  3. Отличноsubstr function!
  4. Вам нужно помнить о последнем подстроке из строки - когда x достигает lenth, остается еще одна подстрока

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


bool isVowel(char c) {
    return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
}

void substr(char str[], int low, int high)
{
    printf("%.*s\n", high-low+1, (str+low));
}

int main(int argc, const char *argv[]) {

    // ch-ch-ch-changes   
    char str[] = "auiouxaeibaou";

    int length = strlen(str);

    int start_index = 0, end_index = 0;

    for (int x = 0; x < length; x++) {
        char c  = str[x];
        if (isVowel(c) == false) {
            end_index = x;
            substr(str, start_index, end_index - 1 );
            start_index = end_index + 1;
        }
    }

    // ch-ch-ch-changes
    end_index = length;
    substr(str, start_index, end_index - 1 );

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...