Помогите найти ошибку в коде задачи [требует правки]

372
24 декабря 2016, 16:50

Сама задача:

Дана строка, заменить в ней символ $ на введённое пользователем имя.

#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;
}
Answer 1

Замените на

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;
}

Оба варианта НЕ обрабатывают рекурсивный $ - т.е. в подмене его быть не должно!

Answer 2

Для начала желательно писать правильные английские слова в качестве идентификаторов. Я бы заменил идентификатор 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?

Как можно видеть, программа никаких функций не использует, чтобы получить результат.

READ ALSO
не работает программа, не могу найти ошибку! [требует правки]

не работает программа, не могу найти ошибку! [требует правки]

Задача такая: нужно написать программу, которая выведет в файл слова в обратном порядке, при этом она поменяет регистр первых букв в словах...

412
Некорректно работает goodFeaturesToTrack в третьей версии OpenCV

Некорректно работает goodFeaturesToTrack в третьей версии OpenCV

Пытаюсь найти особые точки кадра с помощью функции goodFeaturesToTrack в OpenCV 30:

414