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

memmove() поможет
...
Рейтинг: 0 / 0
12.10.2016, 13:00
    #39325256
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
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
12.10.2016, 13:20
    #39325278
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
Можно вообще не копировать, просто взять указатель
Код: plaintext
1.
char* d = c+1;


Но дальше у тебя код должен гарантировать что в d ничего писаться не будет и c будет существовать неизменным пока используется d
...
Рейтинг: 0 / 0
12.10.2016, 13:27
    #39325291
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
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
12.10.2016, 13:28
    #39325292
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
Dima TМожно вообще не копировать, просто взять указатель
Код: plaintext
1.
char* d = c+1;



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

облегчение состоит в том, что строка при заменах только сжимается
...
Рейтинг: 0 / 0
12.10.2016, 13:30
    #39325294
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
snprintf() не подойдет?
...
Рейтинг: 0 / 0
12.10.2016, 13:38
    #39325302
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
кстати, какой толковый способ преобразования есть?
Код: 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
12.10.2016, 13:44
    #39325308
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
ок, понял
Код: plaintext
1.
2.
const char* s = "{#31}";
int a = itoa(s+2);
...
Рейтинг: 0 / 0
12.10.2016, 13:51
    #39325310
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
Charles Weylandоблегчение состоит в том, что строка при заменах только сжимается

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

PS если хрустальный шар не врёт, то у тебя ведь стройка же, бери AnsiString тогда, и не мучай ни себя, ни окружающих ))
...
Рейтинг: 0 / 0
12.10.2016, 14:39
    #39325357
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
egorychто у тебя ведь стройка же
стройка?)) что за стройка?
...
Рейтинг: 0 / 0
12.10.2016, 15:03
    #39325378
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
Charles Weylandegorychто у тебя ведь стройка же
стройка?)) что за стройка?C++ Builder
...
Рейтинг: 0 / 0
12.10.2016, 15:27
    #39325403
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
ms vs 2012
...
Рейтинг: 0 / 0
12.10.2016, 15:32
    #39325410
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
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
12.10.2016, 15:48
    #39325436
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
Charles Weylandms vs 2012ну, значит сбоит шар сегодня ))
бери std::string и не мучайся
...
Рейтинг: 0 / 0
12.10.2016, 15:54
    #39325444
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
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
13.10.2016, 01:13
    #39325776
akuza
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
Charles Weyland,

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

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

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

Не разобрался, как тут можно посмотреть, на какое сообщение ответ идёт.
...
Рейтинг: 0 / 0
13.10.2016, 02:01
    #39325796
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
аа, понял
...
Рейтинг: 0 / 0
13.10.2016, 02:04
    #39325800
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
akuzaman 3 sscanf
ооо, охрененная функция. Только сейчас глянул её описание. Прям бомба
...
Рейтинг: 0 / 0
13.10.2016, 03:52
    #39325813
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
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
13.10.2016, 09:16
    #39325891
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно strcpy(c, c+1) делать?
Пётр СедовЭто сейчас. А через год всё может сильно измениться.
Это как рост человека - ни сейчас, ни через 50 лет он не будет километр. В контексте предметной области 99 - нереально. При этом программа позволит осуществлять замены до 9999, т.к. {#n} - 4 символа. Поэтому расширения точно не будет.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Можно strcpy(c, c+1) делать? / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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