Невозможно изменить содержимое последнего индекса строки в C? - PullRequest
1 голос
/ 29 марта 2019

В настоящее время у меня возникают проблемы с изменением содержимого строки.

Следующая программа, которую я пишу, переставляет слова в строке src, которые начинаются с согласного, так что согласный заканчивается в конце (bob -> obb). Слова, начинающиеся с гласной, остаются неизменными. Результат вставляется в строку dest.

Однако последнее слово ввода предложения всегда заканчивается отсутствующим согласным в конце (bob -> ob). Это говорит о том, что я не могу изменить содержимое последнего индекса строки dest.

Есть причина почему?

void convert(char src[], char dest[]) {
    int i, isVowel, first_pos;
    int len = strlen(src);
    int count = 0;
    char first = 0;

    for (i = 0; i < len; i++) {
        while (!isspace(src[i])) {

            if (first == 0) {
                first = src[i];
                first_pos = i;
            }

            isVowel = first == 'a' || first == 'e' || first == 'i' || first == 'o' || first == 'u';

            if (isVowel == 1) {
                dest[count++] = src[i];
            }   
            else if (i != first_pos) {
                dest[count++] = src[i];
            }   

            i++;
        }   

        if (isVowel == 0) {
            dest[count++] = first;
        }   

        dest[count++] = ' ';
        first = 0;
      }
}

Ввод: "Привет, ребята" Ожидаемый результат: "ih uysg" Фактический результат: "ih uys"

Ответы [ 2 ]

2 голосов
/ 29 марта 2019

Вы должны изменить

while (!isspace(src[i])) {

на

while (src[i] && !isspace(src[i])) {

и функция, наконец, добавится

dest[count++] = '\0';

Модифицированный код:

void convert(char src[], char dest[]) {
    int i, isVowel, first_pos;
    int len = strlen(src);
    int count = 0;
    char first = 0;

    for (i = 0; i <= len; i++) {
        while (src[i] && !isspace(src[i])) {

            if (first == 0) {
                first = src[i];
                first_pos = i;
            }

            isVowel = first == 'a' || first == 'e' || first == 'i' || first == 'o' || first == 'u';

            if (isVowel == 1) {
                dest[count++] = src[i];
            }   
            else if (i != first_pos) {
                dest[count++] = src[i];
            }   

            i++;
        }   

        if (isVowel == 0) {
            dest[count++] = first;
        } 

        dest[count++] = ' ';
        first = 0;
      }
      dest[count++] = '\0';
}
0 голосов
/ 29 марта 2019

Насколько я понимаю, вы хотите перебрать строку слов.Если слово начинается с согласной, вы хотите переместить эту согласную в конец слова (оставив остальную часть слова без изменений).Если слово начинается с гласной, вы хотите оставить все слово без изменений.

В вашем коде я вижу несколько странных вещей:

  • В случае вводаначинается с пробела, который вы используете isVowel неинициализировано, что является неопределенным поведением

  • Кажется, вы никогда не завершаете строку назначения нулем

Это сказало Iдумаю, что ваш алгоритм слишком сложен.Чтобы получить более простую реализацию, рассмотрим этот алгоритм:

While unhandled characters in src:
  if current char is space 
      copy space to dest
  else
      if current char is consonant
          save current char and move to next input char
      copy rest of word to dest
      if first char was consonant
          add saved char to destination

Код может выглядеть следующим образом:

void convert(char src[], char dest[]) 
{
  int i = 0;
  int count = 0;

  while(src[i]) 
  {
    if (isspace(src[i]))
    {
      // Copy the space
      dest[count++] = src[i++];
    }
    else
    {
      int isVowel = src[i] == 'a' || src[i] == 'e' || src[i] == 'i' || src[i] == 'o' || src[i] == 'u';

      char first;
      if (!isVowel)
      {
        // Save first char and move to next char
        first = src[i];
        ++i;
      }

      // Copy rest of word
      while (src[i] && !isspace(src[i]))
      {
        dest[count++] = src[i++];
      };

      if (!isVowel)
      {
        // Add the saved char
        dest[count++] = first;
      }
    }
  }

  // Terminate destination string
  dest[count] = '\0';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...