Вставить символ после каждых 3 символов в строке - PullRequest
0 голосов
/ 15 сентября 2018

Для каждых трех символов, скопированных из str1 в str2, символ ch вставляется в str2.

(Input1) Enter a string:  abc de 
(Input2) Enter a character to be inserted: # 
Output: abc# de

Код:

void insertChar(char *str1, char *str2, char ch) 
{
    int i, j, count = 0, flag = 0;
    char *ptr1, *ptr2, *ptr3;
    ptr1 = str1; //Input string
    ptr3 = &str2; //char string array output

    for (i = 0, j = 0;*ptr1 != '\0'; ptr1++, i++, j++, ptr3++)
    {
        str2[j] = str1[i];
        if (*ptr1 == ' ' && flag != 1)
            ++count;

        if (flag != 1 && count%3)
        {
            flag = 1;
            for(ptr2 = ch;*ptr2 != '\0'; ptr2++)
            {
                str2[++j] = *ptr2;
                ptr3++;
            }
            str2[++j] = ' ';
            ptr3++;
        }
    }
    str2[j] = '\0';
}

Однако мой код не может быть запущен. Могу ли я знать, в чем может быть проблема?

1 Ответ

0 голосов
/ 15 сентября 2018

Как упомянуто в комментарии, есть некоторые проблемы с кодом.

ptr3 = &str2

В этой строке вы не назначаете строку для ptr3.Скорее вы назначаете адрес указателя, который содержит начальный адрес строки.Например: предположим, что первый символ в вашей строке находится в адресной ячейке 1000. Тогда str3 содержит значение 1000. Однако сам str3 будет находиться где-то еще.Давайте предположим, что он расположен в 2000. Затем, ptr3 содержит значение 2000, а после приращения он будет указывать на 2001 и так далее.Таким образом, вы получаете неправильные и опасные значения.

Существует также проблема в строке for(ptr2 = ch;*ptr2 != '\0'; ptr2++).Вы назначаете значение ch для ptr2.Это должно дать вам предупреждение.Опять же, память, на которую указывает ptr2, изменяется.Итак, * ptr2 пытается разыменовать эту ячейку памяти.

Код, который я использовал бы для этого:

void insertChar(char *str1, char *str2, char ch) {
    int count = 0;
    while (*str1) {
        *str2++ = *str1++;
        ++count;
        if (count == 3) {
            *str2++ = ch;
            count = 0;
        }
    }
    *str2 = '\0';
}

Некоторые рекомендации:

  • Попробуйте объявитьпеременные, максимально приближенные к их использованию.
  • Используйте параметр -Wall при компиляции ваших программ
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...