Сама задача:
Дана строка, заменить в ней символ $ на введённое пользователем имя.
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "rus");
int d,p=0,d1;
char S[100];
char name[20];
char bufer[250];
cin.getline(name, 20);
cin.getline(S, 20);
d = strlen(S);
d1 = strlen(name);
for (int i = 0; i <= d; i++)
if (S[i] == '$')
{
for(int g = 0; i <= d1; i++)
bufer[p] = name[g];
p = p + d1;
}
else
{
p++;
bufer[p] = S[i];
}
cout << bufer<<endl;
system("pause");
return 0;
}
Замените на
void replace(string&s, const string& rep)
{
for(size_t pos = s.find('$'); pos != string::npos;
pos = (s.replace(pos,1,rep), s.find('$')));
}
int main(int argc, const char * argv[])
{
string s = "Hello, $ and $!";
string rep = "bro";
replace(s,rep);
cout << s << endl;
}
и не мучайтесь :)
Если приспичило через char* и гарантируете, что буфера хватит - то
void replace(char * buf, const char * rep)
{
char * c;
int len = strlen(rep);
while(c = strchr(buf,'$'))
{
memmove(c+len,c+1,strlen(c+1)+1);
memcpy(c,rep,len);
}
}
int main(int argc, const char * argv[])
{
char buf[256] = "Hello, $ and $!";
char * rep = "bro";
replace(buf,rep);
cout << buf << endl;
}
Оба варианта НЕ обрабатывают рекурсивный $ - т.е. в подмене его быть не должно!
Для начала желательно писать правильные английские слова в качестве идентификаторов. Я бы заменил идентификатор bufer на buffer
char buffer[250];
^^^^^^
Если вы в программе используете стандартные C функции такие, как, например, strlen, то следует включить заголовок <cstring>
#include <cstring>
На самом деле, когда вы имеете дело со строками, то обычно можно обойтись без этой функции и ориентировать на завершающий ноль строки. Иначе вызов strlen при последовательной обработке строки, как это имеет место в вашей программе, лишь отнимает время.
В этом цикле
for(int g = 0; i <= d1; i++)
bufer[p] = name[g];
вы пытаетесь скопировать в bufer помимо других символов также завершающий 0, что на самом деле не надо делать.
А самое главное - вы не увеличиваете индексы p и g, поэтому копирования не происходит, тем не менее индекс i, который не должен увеличиваться, увеличивается.
Правильно было бы записать
for(int g = 0; g < d1; g++)
bufer[p++] = name[g];
а следующее после цикла предложение
p = p + d1;
удалить.
В этом блоке кода вы должны увеличивать индекс p (кстати сказать, это плохое имя для индекса) после предложения с присваиванием, а не до него.
else
{
p++;
bufer[p] = S[i];
}
Вы могли бы все сделать с помощью стандартных функций таких, как, strchr, memcpy и strcpy, но если вы хотите поупражняться в циклах то основной код программы может выглядеть следующим образом
size_t i = 0;
for (size_t j = 0; S[j] != '\0'; j++ )
{
if (S[j] == '$')
{
for (size_t k = 0; name[k] != '\0'; k++)
{
buffer[i++] = name[k];
}
}
else
{
buffer[i++] = S[j];
}
}
buffer[i] = '\0';
Вот демонстрационная программа
#include <iostream>
int main()
{
char S[100] = "Hello $. What are you $ going to say?";
char name[20] = "John Shepard";
char buffer[250];
size_t i = 0;
for (size_t j = 0; S[j] != '\0'; j++ )
{
if (S[j] == '$')
{
for (size_t k = 0; name[k] != '\0'; k++)
{
buffer[i++] = name[k];
}
}
else
{
buffer[i++] = S[j];
}
}
buffer[i] = '\0';
std:: cout << buffer << std::endl;
}
Ее вывод на консоль:
Hello John Shepard. What are you John Shepard going to say?
Как можно видеть, программа никаких функций не использует, чтобы получить результат.
Продвижение своими сайтами как стратегия роста и независимости