Как заменить все вхождения в массиве другим массивом в C - PullRequest
0 голосов
/ 15 апреля 2019

Я хочу заменить все вхождения в массиве (строке) другим массивом.

У меня есть код, который: сохраняет строку в массиве, в котором должно произойти замещение output[], другоймассив, в котором хранится искомая строка как replace[] и третий массив с именем toBeReplacedBy, а замена первого вхождения работает просто отлично, но пропускает другие вхождения в output

, например:

replace[]:

abc


toBeReplacedBy[]:

xyz 

output[]:

abcdefabc

becomes
xyzdefabc


but it should become:
xyzdefxyz

Я подозреваю, что проблема заключается в коде заменителя:

    //the replacer
    for (i = 0; i<80; i++) {
        if (output[i] == replace[i])
            output[i] = toBeReplacedBy[i];
    }

    //debug purpose

    puts("output[]:\n");
    puts(output);


    return 0;
}

Что я здесь сделал неправильно и как я могу заставить его заменить все вхождения в массиве.

пожалуйста, имейте в виду, что я хочу использовать только stdio.h для этого

заранее спасибо

Ответы [ 3 ]

2 голосов
/ 15 апреля 2019

Никогда не повторяйте дальше, чем длина массива. Это приводит к неопределенному и, возможно, опасному поведению. Если вы ожидаете только строки, используйте что-то вроде:

int i = 0; 
while(output[i] != '\0')
{
    // your logic here
    i++;
}

Кроме того, вы хотите проверить наличие одновременных появлений одних и тех же персонажей. Но в вашем коде вы проверяете только первые три символа. Все после этого - неопределенное поведение, потому что вы не можете знать, что возвращает replace[3].

Нечто подобное может сработать:

int i = 0;
int j = 0;
int k;
while(output[i] != '\0')
{
    if (output[i] == replace[j])
        j++;
    else
        j = 0;
    // replace 3 with the array length of the replace[] array
    if (j == 3)
    {
        for(k = i; j >= 0; k-- )
        {
            output[k] = toBeReplacedBy[j]
            j--
        }
        j = 0;
    }
    i++;
}

Но, пожалуйста, проверьте границы массива.

edit: Кроме того, как заявляет Нелли, использование отладчика поможет вам понять, что пошло не так. Просмотрите программу по шагам и посмотрите, как и когда меняются значения.

0 голосов
/ 16 апреля 2019

Вы должны использовать strlen (), чтобы узнать длину вашего массива или выполнить итерацию, пока не достигнете конца вашего массива ('\ 0').

'\ 0' и strlen доступны только для массиваof char.

Ваш цикл должен выглядеть так:

int i = 0;
int len = strlen(my_string);
while (i < len)
{
  //logic here
  i = i + 1;
}

ИЛИ

int i = 0;
while (my_string[i] != '\0')
{
  // logic here
  i = i + 1;
}
0 голосов
/ 15 апреля 2019

Первый совет - попытаться отладить вашу программу, если она не работает.

for (i = 0; i<80; i++) {
        if (output[i] == replace[i])
            output[i] = toBeReplacedBy[i];
    }

В этом цикле есть две проблемы.

Первое - это итерация до тех пор, пока i не достигнет 80. Давайте посмотрим, что произойдет, когда i станет 3. output[3] в случае abcdefabc равно d , но что такое replace[3]? В вашем массиве замены было всего 3 буквы, поэтому вы должны вернуться в массив замены, как только закончите с одним вхождением его в исходную строку.

Во-вторых, вы проверяете букву за буквой.

Скажем, исходный массив, который вы назвали output каким-то образом был abkdefabc , первые три буквы не соответствуют вашей замещающей строке, но вы проверите первые две буквы, которые будут совпадать с первыми двумя заменами буквы и вы их поменяете неправильно.

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

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