powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Можно strcpy(c, c+1) делать?
25 сообщений из 26, страница 1 из 2
Можно strcpy(c, c+1) делать?
    #39325226
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть строка char* c, в ней хочется удалить первый символ.
Имеется ли возможность скопировать в неё строку из строки по адресу c+1? Или только циклом пробегаться?
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325252
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weyland,

memmove() поможет
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325256
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weyland,

Для strcpy строки не должны перекрываться
$ man strcpy | grep overlap
The strcpy() function copies the string pointed to by src, including the terminating null byte ('\0'), to the buffer pointed to by dest. The strings may not overlap, and the destination string dest must be large

из функций можно использовать memmove, но если это частный случай то быстрее циклом т.к. не нужно считать длину.
а вообще покажи код полностью - ты потом этот указатель куда суешь?
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325278
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно вообще не копировать, просто взять указатель
Код: plaintext
1.
char* d = c+1;


Но дальше у тебя код должен гарантировать что в d ничего писаться не будет и c будет существовать неизменным пока используется d
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325291
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAа вообще покажи код полностью - ты потом этот указатель куда суешь?
дано:
строка char* s = "item{#0}/r{#2}/opa{#1}"
и массив a[0]=4, a[1]=1, a[2]=7

я получил массив параметров
char*, со значениями "{#0}" "{#2}" "{#1}" - массив извлечён регуляркой из искомой строки

Задача:
переделать s в строку "item4/r7/opa1"
и вернуть её в качестве результата.
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325292
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМожно вообще не копировать, просто взять указатель
Код: plaintext
1.
char* d = c+1;



Но дальше у тебя код должен гарантировать что в d ничего писаться не будет и c будет существовать неизменным пока используется d
надо именно копировать, чтобы убрать лишние символы после замены {#1} на число

облегчение состоит в том, что строка при заменах только сжимается
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325294
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snprintf() не подойдет?
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325302
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, какой толковый способ преобразования есть?
Код: plaintext
1.
2.
const char* s = "{#31}";
int a = get31FromS(s);


?
сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
const char* s = "{#31}";
char * ss = new char[strlen(s)];
strcpy(ss, s+2);
char* ending = strstr(ss, "}");
*ending = 0;
int a = atoi(ss);
delete[] ss;


мог опечататься, но суть такая.
Что-то тут много кода, что-то я не учёл.
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325308
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок, понял
Код: plaintext
1.
2.
const char* s = "{#31}";
int a = itoa(s+2);
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325310
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weylandоблегчение состоит в том, что строка при заменах только сжимается

Точно сжимается?
Массив a какого типа? там не может такого оказаться a[3]=12313?
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325319
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAМассив a какого типа? там не может такого оказаться a[3]=12313?
unsigned int* a;
но в нём значения могут быть где-то до 9. Анреал, если будет значение 99. А если 100 или больше, то такой массив не пройдёт проверку и вылетит эксепшн ещё до выполнения данного алгоритма, т.к. явно что-то пошло не так.
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325351
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles WeylandЕсть строка char* c, в ней хочется удалить первый символ.
Имеется ли возможность скопировать в неё строку из строки по адресу c+1? Или только циклом пробегаться?прям надо pure C? std::string + replace чем не подходит?

PS если хрустальный шар не врёт, то у тебя ведь стройка же, бери AnsiString тогда, и не мучай ни себя, ни окружающих ))
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325357
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychто у тебя ведь стройка же
стройка?)) что за стройка?
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325378
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weylandegorychто у тебя ведь стройка же
стройка?)) что за стройка?C++ Builder
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325403
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ms vs 2012
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325410
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles WeylandPPAа вообще покажи код полностью - ты потом этот указатель куда суешь?
дано:
строка char* s = "item{#0}/r{#2}/opa{#1}"
и массив a[0]=4, a[1]=1, a[2]=7

я получил массив параметров
char*, со значениями "{#0}" "{#2}" "{#1}" - массив извлечён регуляркой из искомой строки

Задача:
переделать s в строку "item4/r7/opa1"
и вернуть её в качестве результата.

В С строки не возвращаются. А для решения такой простейшей задачи одного цикла достаточно.
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325436
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weylandms vs 2012ну, значит сбоит шар сегодня ))
бери std::string и не мучайся
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325444
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

Если уже используется boost, то так:

#include <boost/algorithm/string/replace.hpp>
Код: plaintext
1.
2.
3.
4.
std::string in_place = "item{#0}/r{#2}/opa{#1}";
boost::replace_all(in_place, "{#0}", "4");
boost::replace_all(in_place, "{#2}", "1");
boost::replace_all(in_place, "{#1}", "1");
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325776
akuza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Charles Weyland,

man 3 sscanf
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325787
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне ответ, в принципе, довольно быстро прилетел - я воспользовался memmove
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325793
akuza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Charles Weyland,

если это был ответ на мой пост - то я про

кстати, какой толковый способ преобразования есть?

Не разобрался, как тут можно посмотреть, на какое сообщение ответ идёт.
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325796
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аа, понял
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325800
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akuzaman 3 sscanf
ооо, охрененная функция. Только сейчас глянул её описание. Прям бомба
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325813
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weylandдано:
строка char* s = "item{#0}/r{#2}/opa{#1}"
и массив a[0]=4, a[1]=1, a[2]=7Charles WeylandЗадача:
переделать s в строку "item4/r7/opa1"
и вернуть её в качестве результата.Если использовать std::string, то я бы сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
#include <assert.h>
#include <string.h> // для strchr
#include <stdlib.h> // для strtol
#include <string>
#include <sstream>

using namespace std;

string instantiate(const char template_[], const unsigned int items[], int items_count) {
  ostringstream stream;
  size_t pos = 0;
  for (;;) {
    // ищем '{'
    const char* l_brace = strchr(template_ + pos, '{');
    if (l_brace == NULL) break;
    size_t l_brace_pos = l_brace - template_;

    stream.write(template_ + pos, l_brace_pos - pos); // пишем текст до '{'
    pos = l_brace_pos + 1; // пропускаем '{'

    assert(template_[pos] == '#');
    pos++; // пропускаем '#'

    // сканируем индекс item-а
    char* item_index_end;
    int item_index = strtol(template_ + pos, &item_index_end, /*base:*/10);
    assert((0 <= item_index) && (item_index < items_count));
    pos = item_index_end - template_; // пропускаем индекс item-а

    stream << items[item_index]; // пишем item

    assert(template_[pos] == '}');
    pos++; // пропускаем '}'
  }
  stream << (template_ + pos); // пишем остаток
  return stream.str();
}

int main() {
  unsigned int items[] = {4, 1, 7};
  assert(instantiate("item{#0}/r{#2}/opa{#1}", items, 3) == "item4/r7/opa1");
  return 0;
}

Хотя код с replace наверное проще будет.

Charles Weyland
Код: plaintext
1.
char* ending = strstr(ss, "}");

Если ищем один символ, то лучше использовать функцию strchr.

Charles WeylandPPAМассив a какого типа? там не может такого оказаться a[3]=12313?
unsigned int* a;
но в нём значения могут быть где-то до 9. Анреал, если будет значение 99.Это сейчас. А через год всё может сильно измениться.
...
Рейтинг: 0 / 0
Можно strcpy(c, c+1) делать?
    #39325891
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр СедовЭто сейчас. А через год всё может сильно измениться.
Это как рост человека - ни сейчас, ни через 50 лет он не будет километр. В контексте предметной области 99 - нереально. При этом программа позволит осуществлять замены до 9999, т.к. {#n} - 4 символа. Поэтому расширения точно не будет.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Можно strcpy(c, c+1) делать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]