Как я могу переместить все гласные из строки в другой массив - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь написать функцию на C, которая принимает 2 параметра (char * string_1, char * string_2), которые будут перемещать все гласные из строки _1 в строку_2.Я написал функцию, чтобы сделать это, но вывод не то, что я ожидал.Содержимое string_2 выглядит довольно случайным и иногда содержит не гласные.

Я написал цикл while для итерации по string_1 с оператором if для проверки гласных.Используя указатели, я попытался установить содержимое строки _2 + i на гласную.Затем я сделал место, где гласный был в string_1, равным ''.Я пробовал несколько разных алгоритмов, и проследил их тоже, но я не уверен, где проблема.Кроме того, мне не разрешено использовать библиотеку строк.Любая помощь очень ценится.

#include<stdio.h>
#define MAX_STR_LEN 2048

void moveVowels(char *string_1, char *string_2)
{

 int i;
 i=0;
 while (*(string_1 + i) != '\0')
 {
    if (*(string_1 + i) == 'a' || *(string_1 + i) == 'A' || *(string_1 + 
    i) == 'e' || *(string_1 + i) == 'E' || *(string_1 + i) == 'i' ||
    *(string_1 + i) == 'I' || *(string_1 + i) == 'o' || *(string_1 + i) == 
    'O' || *(string_1 + i) == 'u' || *(string_1 + i) == 'U')
    {
    *(string_2 + i) = *(string_1 + i);
    *(string_1 + i) = ' ';
    }
    i++;
 }
}


int main()
{
 char stringy[MAX_STR_LEN]="but they also had a secret, and their greatest 
 fear";
 char vowels[MAX_STR_LEN];
 printf("%s\n",stringy);
 moveVowels(&stringy[0],&vowels[0]);
 printf("%s\n", stringy);
 printf("%s\n", vowels);

 return 0;

}

Ожидаемый результат:

but they also had a secret, and their greatest fear
b t th y  ls  h d   s cr t,  nd th  r gr  t st f  r
ueaoaaeeaeieaeea

Фактический результат:

but they also had a secret, and their greatest fear
b t th y  ls  h d   s cr t,  nd th  r gr  t st f  r
\u]

Ответы [ 3 ]

2 голосов
/ 18 июня 2019

Мы, новички, должны помогать друг другу. :)

Вот и вы.

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

#define MAX_STR_LEN 2048

char * moveVowels( char *s1, const char *s2 )
{
    const char *vowels = "aeiou";

    size_t n = strlen( s2 );

    for ( char *p = s1; *s2 != '\0'; ++s2 )
    {
        if ( strchr( vowels, tolower( ( unsigned char )*s2 ) ) != NULL )
        {
            s1[n++] = *s2;
            *p++ = ' ';
        }
        else
        {
            *p++ = *s2;
        }
    }

    s1[n] = '\0';

    return s1;
}

int main(void) 
{
    char s1[MAX_STR_LEN] =
    {
        "but they also had a secret, and their greatest fear"
    };

    char s2[MAX_STR_LEN];   

    puts( s1 );
    puts( moveVowels( s2, s1 ) );

    return 0;
}

Вывод программы:

but they also had a secret, and their greatest fear
b t th y  ls  h d   s cr t,  nd th  r gr  t st f  rueaoaaeeaeieaeea

Примите во внимание, чтов массиве символов назначения должно быть достаточно места для размещения гласных в хвосте исходной строки.

Если вы хотите вставить символ новой строки между исходной строкой и гласными, то функция может выглядеть следующим образом.

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

#define MAX_STR_LEN 2048

char * moveVowels( char *s1, const char *s2 )
{
    const char *vowels = "aeiou";

    size_t n = strlen( s2 );

    s1[n++] = '\n';

    for ( char *p = s1; *s2 != '\0'; ++s2 )
    {
        if ( strchr( vowels, tolower( ( unsigned char )*s2 ) ) != NULL )
        {
            s1[n++] = *s2;
            *p++ = ' ';
        }
        else
        {
            *p++ = *s2;
        }
    }

    s1[n] = '\0';

    return s1;
}

int main(void) 
{
    char s1[MAX_STR_LEN] =
    {
        "but they also had a secret, and their greatest fear"
    };

    char s2[MAX_STR_LEN];   

    puts( s1 );
    puts( moveVowels( s2, s1 ) );

    return 0;
}

В этом случае программа выводит

but they also had a secret, and their greatest fear
b t th y  ls  h d   s cr t,  nd th  r gr  t st f  r
ueaoaaeeaeieaeea

Если вам не разрешено использовать стандартные строковые функции C, вы можете заменить их вызовы циклами.

Например, объявление

size_t n = strlen( s2 );

может заменить этот фрагмент кода

size_t n = 0;

while ( s2[n] ) ++n;

Так что вам нужно заменить функцию strchr на цикл самостоятельно.

0 голосов
/ 18 июня 2019

следующий предложенный код:

  1. безупречная компиляция
  2. не использует ни одной из строковых функций
  3. выполняет требуемую функциональность
  4. избегаетprintf(), поскольку он сильно загружает процессор
  5. избегает выражений типа: *(string_1 + i)
  6. использует заголовочный файл ctype.h, который предоставляет toupper()

и теперь предложенный код:

#include <stdio.h>
#include <ctype.h>

#define MAX_STR_LEN 2048

void moveVowels(char *str, char *extractedVowels)
{
    for( size_t j = 0, i = 0; string_1[i]; i++ )
    {
        int temp = toupper( str[i] );
        if (   temp == 'A' 
            || temp == 'E' 
            || temp == 'I' 
            || temp == 'O' 
            || temp == 'U')
        {
            extractedVowels[j] = str[i];
            j++;
            str[i] = ' ';
        }
    }
}


int main( void )
{
    char stringy[MAX_STR_LEN]="but they also had a secret, and their greatest fear";
    char vowels[MAX_STR_LEN] = {'\0'};

    puts( stringy );

    moveVowels(&stringy[0],&vowels[0]);

    puts( stringy );
    puts( vowels );

    return 0;
}

выполнение предложенного кода приводит к:

but they also had a secret, and their greatest fear
b t th y  ls  h d   s cr t,  nd th  r gr  t st f  r
ueaoaaeeaeieaeea

Однако код OP (и предлагаемый код) не обрабатываются при трейлинге'y' также является гласным.

0 голосов
/ 18 июня 2019

Чтобы отслеживать смещение в строке назначения, вы можете либо ввести новую переменную - либо просто увеличить сам указатель.

Опция 1

В этом случае вам нужна отдельная переменнаяотслеживать смещение в строке назначения.В вашей функции moveVowels() добавьте новую переменную

int j = 0;

и измените

*(string_2 + i) = *(string_1 + i);

на

*(string_2 + j++) = *(string_1 + i);

В конце функции moveVowels() добавьтеТерминатор NULL в строке назначения:

*(string_2 + j) = '\0';

Опция 2

В этом случае вы просто увеличиваете указатель каждый раз, когда добавляете новый гласный:

*(string_2++) = *(string_1 + i);

Опять же, не забудьте нулевой терминатор:

*string_2 = '\0';
...