Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

поиск в строке

1.9K
12 мая 2005 года
ProgMaster
47 / / 29.08.2004
Код:
char outBuff[] = "number M123456789012", chNeeded[] = "210987654321", *tmp, chSearch[]="M";
char formatted[256] = {0};
// Поиск "М" в outBuff (в исходной строке)
tmp = strstr(outBuff, chSearch);

// поскольку нужна буква M (т.е. её заменять не нужно) то свигаем на ещё один байт положение
tmp += 1;
// ставим нуль символ после "М" для того чтобы потом копировать только начало строки
*tmp = 0;
// копируем в строку formatted всё вместе с буквой M до цифр
strcpy(formatted, outBuff);

Задача: Заменить все цифры которые следуют после "М" на нужные мне. Кол-во цифры всегда одинаковое - 12, так что их определять не нужно.
outBuff - исходная строка с текстом.
chNeeded - то что нужно подставить.
chSearch - то что нужно найти
tmp - темповая строка для работы.

Need help :(
488
12 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Код:
char outBuff[] = "number M123456789012", chNeeded[] = "210987654321", *tmp, chSearch[]="M";
char formatted[256] = {0};

// Поиск "М" в outBuff (в исходной строке)
tmp = strstr(outBuff, chSearch);

// поскольку нужна буква M (т.е. её заменять не нужно) то свигаем на ещё один байт положение
tmp++;
// ставим нуль символ после "М" для того чтобы потом копировать только начало строки
*tmp = 0;
// копируем в строку formatted всё вместе с буквой M до цифр
strcpy(formatted, outBuff);
strcat(formatted, chNeeded);
//если еще есть что-то после цифр в outBuff
//тогда можно написать
tmp++;
if(strlen(tmp)>11)strcat(formatted, tmp+11);
425
13 мая 2005 года
sq_deep
498 / / 18.02.2005
По-сишному это будет всего 2 строки
 
Код:
strncpy(formatted, outbuff, tmp-outbuff);
    strcpy(formatted+tmp-outbuff, tmp+1);
И неплохо бы ещё перед этим добавить
 
Код:
if (!tmp)
    ... not found...
425
13 мая 2005 года
sq_deep
498 / / 18.02.2005
Блин, скобки забыл... Полный текст такой:
Код:
char outBuff[] = "number M123456789012", chNeeded[] = "210987654321", *tmp, chSearch[]="M";
        char formatted[256];

        // Поиск "М" в outBuff (в исходной строке)
        tmp = strstr(outBuff, chSearch);

    if (tmp)
    {
        strncpy(formatted, outBuff, tmp-outBuff);
        strcpy(formatted+(tmp-outBuff), chNeeded);
    }
488
13 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by sq_deep
Блин, скобки забыл... Полный текст такой:
Код:
char outBuff[] = "number M123456789012", chNeeded[] = "210987654321", *tmp, chSearch[]="M";
        char formatted[256];

        // Поиск "М" в outBuff (в исходной строке)
        tmp = strstr(outBuff, chSearch);

    if (tmp)
    {
        strncpy(formatted, outBuff, tmp-outBuff);
        strcpy(formatted+(tmp-outBuff), chNeeded);
    }

В 12:35 Вы исправили только один баг. Из первоначальных 4, осталась половина :). Вы сегодня тоже как я до 3 утра работали?

488
13 мая 2005 года
Mоngооsе
465 / / 01.04.2005
 
Код:
char outBuff[] = "number M123456789012", chNeeded[] = "210987654321", *tmp, chSearch[]="M";
char formatted[256];

strcpy(formatted, outBuff);
tmp = strstr(formatted, chSearch);
if(tmp)strncpy(tmp+1, chNeeded, srtlen(chNeeded));
425
13 мая 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by Mоngооsе
В 12:35 Вы исправили только один баг. Из первоначальных 4, осталась половина :). Вы сегодня тоже как я до 3 утра работали?

Покажите остальные три. Учиться буду.

488
13 мая 2005 года
Mоngооsе
465 / / 01.04.2005
 
Код:
char outBuff[] = "number M123456789012", chNeeded[] = "210987654321", *tmp, chSearch[]="M";
char formatted[256];
  // Поиск "М" в outBuff (в исходной строке)
  tmp = strstr(outBuff, chSearch);
  if(tmp)
  {
    strncpy(formatted, outBuff, tmp-outBuff[color=red]+1[/color]);
    strcpy(formatted+(tmp-outBuff [color=red]+1[/color]), chNeeded);
  }
Я говорил о двух оставшихся...
425
13 мая 2005 года
sq_deep
498 / / 18.02.2005
Принято.
488
13 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by sq_deep
Принято.

А зря. Потенциальный баг. Вместо 1-ц, нужно бы писать strlen(chSearch), или хотя бы вместо strstr(...) использовать strch.

425
13 мая 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by Mоngооsе
А зря. Потенциальный баг. Вместо 1-ц, нужно бы писать strlen(chSearch), или хотя бы вместо strstr(...) использовать strch.

Нет, уважаемый Mоngооsе, у меня было правильно написано. Ваши исправления ошибочны. Пора, видимо, вам всё же отдохнуть. Нельзя так много работать ;)

Ну, а по поводу strchr и strlen вы, конечно, правы. Однако, я не хотел переписывать всю программу, а максимально постарался двигаться в русле авторского стиля. Думаю, через некоторое короткое время ProgMaster будет использовать str* легко и непринуждённо и тогда напишет эту программу более правильно и превратится в настоящего мастера программирования, такого, как вы.

488
13 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by sq_deep
Нет, уважаемый Mоngооsе, у меня было правильно написано. Ваши исправления ошибочны. Пора, видимо, вам всё же отдохнуть. Нельзя так много работать ;)

Уж извините. Прокрутите в голове случай, когда слово начинается буквой "M". Тогда tmp==outBuff. Ф-ия
strncpy(formatted, outBuff, tmp-outBuff);
перекопирует 0 символов. Хотя буква M должна быть в результирующей строке.

425
14 мая 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by Mоngооsе
...буква M должна быть в результирующей строке...

Да, вы правы. Мне почему-то показалось, что она только отмечает позицию замены.

1.9K
14 мая 2005 года
ProgMaster
47 / / 29.08.2004
Цитата:
Originally posted by Mоngооsе
 
Код:
//если еще есть что-то после цифр в outBuff
//тогда можно написать
tmp++;
if(strlen(tmp)>11)strcat(formatted, tmp+11);


Такс....тут после номера tmp++ делает пробел. А дальше что происходит никак не пойму ?

488
14 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by ProgMaster
Такс....тут после номера tmp++ делает пробел. А дальше что происходит никак не пойму ?


Он не делает пробел. Просто пропускает 0-й символ.
Но алгоритм ниже не лучше?

 
Код:
char outBuff[] = "number M123456789012", chNeeded[] = "210987654321", *tmp, chSearch[]="M";
char formatted[256];

strcpy(formatted, outBuff);
tmp = strstr(formatted, chSearch);
if(tmp)strncpy(tmp+strlen(chSearch), chNeeded, srtlen(chNeeded));
Imho он тем хорош, что если строка не содержит chNeeded, все равно возвращается исходная строка, а не formatted нулевой длины.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог