Функция Pig Latin дает неправильный вывод - PullRequest
0 голосов
/ 01 мая 2020

Я пишу функцию для преобразования слова в пиглатин. Однако я получаю неправильный вывод, и я не уверен, что я делаю неправильно. это мой код ниже. Для некоторых слов он просто возвращает исходное неизмененное слово. Может быть, я иду по этому пути неправильно. Я был бы признателен за помощь.

char* convertToPigLatin(char* engStr, char* pLatinStr)
{
    int length = 0;
    char rSuffix[10];
    char vowels[6] = "aeiou";
    int i = 0;

    while (engStr[length] != '\0')
    {
        length++;
    }//setting int length equal to the length of the input string. 


    while (i < length)
    {
        for (int j = 0; j < 6; j++)
        {
            //checking if the lead character is a consonant
            if (engStr[0] != vowels[j])
            {
                rSuffix[j] =  '-';
                rSuffix[j+1] = engStr[0];

            }
            //checking if there is a string of consonants
            else if ((i != 0)&&(engStr[i] != vowels[j]))
            {
                rSuffix[j] = engStr[i];
            }
            //appending ay to consonant leading string
            else if (engStr[i] == vowels[j])
            {
                rSuffix[j] = 'a';
                rSuffix[j + 1] = 'y';
                rSuffix[j + 2] = '\0';

                strcat(engStr, rSuffix);
            }
            //string starting with vowel 
            else if (engStr[0] == vowels[j])
            {
                rSuffix[j] = '-';
                rSuffix[j + 1] = 'w';
                rSuffix[j + 2] = 'a';
                rSuffix[j + 3] = 'y';
                rSuffix[j + 4] = '\0';

                strcat(engStr, rSuffix);
            }

        }//for loop that goes thru the vowel array

        i++;
    }//while loop to go through the input string

    for (int k = 0; k < 25; k++)
    {
        pLatinStr[k] = engStr[k];
    }

    return pLatinStr;
}

это для назначения, поэтому заголовок функции должен быть таким.

1 Ответ

0 голосов
/ 01 мая 2020

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

После https://en.wikipedia.org/wiki/Pig_Latin и добавление 'ay' в конце (не 'way', ни 'yay' et c) возможный способ сделать это:

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

char* convertToPigLatin(char* engStr, char* pLatinStr)
{
  const char vowels[] = "aeiou";

  if (! engStr[0])
    /* empty string, not in pig latin def, decide to put ay */
    strcpy(pLatinStr, "ay");
  else if (strchr(vowels, engStr[0]) != NULL) {
    /* starts by a vowels */
    strcpy(pLatinStr, engStr);
    strcat(pLatinStr, "ay");
  }
  else {
    /* search first vowel */
    char * p = engStr + 1;

    while (*p && (strchr(vowels, *p) == NULL))
      p += 1;

    if (! *p)
      /* no vowel, not in pig latin def, decide to let word unchanged */
      strcpy(pLatinStr, engStr);
    else {
      size_t ln = strlen(p);

      strcpy(pLatinStr, p);
      strncpy(pLatinStr + ln, engStr, p - engStr);
      strcpy(pLatinStr + ln + (p  - engStr), "ay");
    }
  }

  return pLatinStr;
}

int main(int argc, char ** argv)
{
  if (argc == 2) {
    char * p = malloc(strlen(argv[1]) + 3);

    printf("'%s'\n", convertToPigLatin(argv[1], p));
    free(p);
  }
  else
    fprintf(stderr, "usage : %s <word>\n", *argv);

  return 0;
}

конечно convertToPigLatin предполагает, что второй аргумент достаточно велик

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -g -Wall p.c
pi@raspberrypi:/tmp $ ./a.out ste
'estay'
pi@raspberrypi:/tmp $ ./a.out aze
'azeay'
pi@raspberrypi:/tmp $ ./a.out mommy
'ommymay'
pi@raspberrypi:/tmp $ ./a.out cf
'cf'
pi@raspberrypi:/tmp $ ./a.out ""
'ay'
pi@raspberrypi:/tmp $ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...