Это не домашнее задание, а учеба на среднесрочную перспективу.
Я не могу использовать любой тип индексирования массива, такой как 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
.
Поскольку это проблема исследования, вот подсказка, чтобы вы начали. Попробуйте инициализировать массив результатов. Я сделал это:
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';
Ваш код совершенно правильный и небольшая ошибка. Существует факт строки, вечная строка должна заканчиваться нулевым символом. поэтому просто добавьте * R = '\ 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++;
}
}