Использование указателей для замены символов в строках C

0

Это не домашнее задание, а учеба на среднесрочную перспективу.

Я не могу использовать любой тип индексирования массива, такой как str [i] или * (str + i)

Мне нужно взять c-строку "EECS280ISAWESOME" и заменить "E" на c-строку "XY". Я также должен допускать множественную длину переменной "XY".

Дано следующее:

int main () {
    const char* S = "EECS280ISAWESOME";
    const char* P = "XY";
    char result[256];
    subsituteChar(S,P,'E', result);
    cout << result << endl;
} 

Мое решение кажется сложной/плохой практикой/и уродливой. Я мог бы сделать это лучше с использованием отсрочки и добавления *(R+1) но я не думаю, что это разрешено.

void subsituteChar(const char* S, const char* P, char c, char* R) {
    while(*S != '\0') {
        if(*S == c) {
            const char* PP = P;
            while (*P != '\0') {
                *R = *P;
                R++;
                P++;
            }
            P = PP;
        } else {
            *R = *S;
            R++;
        }
        S++;
    }
}

Это работает, но я остался с XYXYCS280ISAWXYSOMXY2. Я понятия не имею, откуда взялось странное 2.

Теги:
pointers

3 ответа

0
Лучший ответ

Поскольку это проблема исследования, вот подсказка, чтобы вы начали. Попробуйте инициализировать массив результатов. Я сделал это:

char result[256];
for (int i = 0; i < 250; ++i)
    result[i] = 'a';
result[250] = 0;

Теперь запустите свой код еще раз, и вы увидите, что у вас много символов "a" в конце вашего вывода, вплоть до того момента, когда вы доберетесь до персонажа 250. То есть вы увидите:

"XYXYCS280ISAWXYSOMXYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

Если вы хотите выяснить остальное для себя, STOP READING NOW.


Проблема заключается в том, что вы явно не завершаете строку.

Обратите внимание, что это не проблема с заменой вашего последнего символа S, а скорее на состояние вашего терминального контура. Поскольку вы не вручную копируете символ "\ 0" из S, вы надеетесь, что массив результатов будет заполнен символами "\ 0", которые C и C++ не гарантируют.

Просто добавив следующую строку в конец вашей функции substituteChar, она решит проблему:

*R = '\0';

0

Ваш код совершенно правильный и небольшая ошибка. Существует факт строки, вечная строка должна заканчиваться нулевым символом. поэтому просто добавьте * R = '\ 0'; в конце времени функция и этот алгоритм работают отлично.

0

Это подходит?

#include<stdio.h>
int main () {
    const char* S = "EECS280ISAWESOME";
    const char* P = "XY";
    char result[256];
    while(*S)
    {
        if(*S=='E') 
            printf("XY");
        else 
            printf("%c", *S);
        S++;
    }
} 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню