Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Задача со строками.  
:(
    Опции темы
shoman
Дата 15.5.2007, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Помогите, пожалуйста, справиться со следующей задачей:
В строке s подсчитать кол-ва вхождений своего имени и к каждому вхождению своего имени дописать фамилию.
наработка:

Код



#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include <cstdlib>
#define MAX 100 

using namespace std;

int main(int argc, char *argv[])
{

    char  s[MAX];              
    char  substr[MAX];   
char substr2[MAX];         
    int   n = 0,c=0;         
    char* temp = s;    
    
    cout<<"Input string"<<endl;  
    gets(s);                     
    cout<<"Input name"<<endl;     
    gets(substr);  
cout<<"Input family"<<endl;          
    gets(substr2);                  
   
    
    while((temp = strstr(temp, substr)) != NULL) 
    {
   
       n++;
             
cout<<strcpy(substr,substr2);


        temp++;                 
                       

    }

cout<<endl;
    cout<<"kol-vo vxojdenyi="<<n<<endl;         

//cout<<s<<endl;
cin.ignore(2);
  return 0;

}





кол-во вхождений находится без проблем, а с конкантенацией фамилии траблы..функция strcat() после 1-го присоединения завершает null символом и всё :( ..пробовал с циклом - та же фигня..


M
Alexeis
Модератор: выбирайте тип подсветки кода  http://forum.vingrad.ru/index.php?show_typ...howtopic=126445




Это сообщение отредактировал(а) Alexeis - 15.5.2007, 10:14
PM MAIL   Вверх
dizzy1984
Дата 15.5.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Код

#include <mem.h>
#include <string.h>
#include <stdio.h>

void strins(char *pDest, const char * pSource, int nPos)
{
    memmove(pDest + nPos + strlen(pSource), pDest + nPos, strlen(pDest + nPos) + 1);
    memcpy(pDest + nPos, pSource, strlen(pSource));
}

void main()
{
    char szString[1024],
         szName[512],
         szFamilyName[512];

    printf("Строка : ");
    gets(szString);
    printf("Имя : ");
    gets(szName);
    printf("Фамилия : ");
    gets(szFamilyName);

    char *pCurPos = szString;
    while (pCurPos = strstr(pCurPos, szName))
    {
        strins(szString, szFamilyName, pCurPos - szString + 1);
        pCurPos += strlen(szFamilyName);
    }
    printf("%s\n", szString);
}

PM MAIL   Вверх
shoman
Дата 15.5.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Спасибо огромной! Если не затруднит, можете как-то прокомментировать сорц, ибо я не очень понимаю что в нём происходит..
PM MAIL   Вверх
dizzy1984
Дата 16.5.2007, 05:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Код

#include <mem.h>

для объявлений memmove, memcpy
Код

#include <string.h>

для объявлений strlen
Код

#include <stdio.h>

для объявлений printf, gets
Код

void strins(char *pDest, const char * pSource, int nPos)
{
memmove(pDest + nPos + strlen(pSource), pDest + nPos, strlen(pDest + nPos) + 1);
memcpy(pDest + nPos, pSource, strlen(pSource));
}

Вставляет в строку pDest строку pSource после индекса nPos.
Первый индекс имеет значение 0.
Код

void main()
{
char szString[1024],
szName[512],
szFamilyName[512];

определяем 3 массива для входной строки, имени и фамилии
Код

printf("Строка : ");
gets(szString);
printf("Имя : ");
gets(szName);
printf("Фамилия : ");
gets(szFamilyName);

даем возможность ввести их
Код

char *pCurPos = szString;
while (pCurPos = strstr(pCurPos, szName))
{
strins(szString, szFamilyName, pCurPos - szString + 1);
pCurPos += strlen(szFamilyName);
}
printf("%s\n", szString);
}

pCurPos - указатель на текущий найденный фрагмент.
Первоначально указывает на начало строки.
После каждого успешного (не NULL) найденного значения мы используем его для указания места вставки
Код

strins(szString, szFamilyName, pCurPos - szString + 1);

Значит вставить в строк szString строку szFamilyName с позиции pCurPos - szString + 1.
Код

printf("%s\n", szString);

Выводим результат

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0425 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.