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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> срочно нужно написать функцию 
:(
    Опции темы
chudik
Дата 5.5.2007, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



помогите написать функцию  для дублирования строки
например: "боб" -> "боббоб"
PM MAIL   Вверх
anwe
Дата 5.5.2007, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Посмотри API-функцию lstrcat.
PM MAIL   Вверх
apook
Дата 5.5.2007, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include"iostream.h"


void duplicat( char wstr[] )
{
int i, j, c;
for( i=0; wstr[ i ]!='\0'; i++ );

for( j=i, c=j, i=0; c>0; j++, i++, c-- )
    wstr[ j ]=wstr[ i ];

return;
}


void main()
{
char str[ 100 ]="Bob";

duplicat( str );

cout << str << endl;

return;
}



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
adLucem
Дата 5.5.2007, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

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



Дублирование строки с выделением памяти для новой строки.
Код

#include "stdio.h"
#include "string.h"

char *DuplicateString ( const char *source ) {
    char *result = new char [ strlen ( source ) * 2 + 1 ];
    strcpy ( result, source );
    strcpy ( result + strlen ( source ), source );
    return result;
}

void main ( ) {
    char source [10] = "Bob";
    printf ( "%s\n", DuplicateString ( source ) );
}


Так как DuplicateString выделяет память для строки, то не забывайте освобождать ее.

Код

void main ( ) {
    char source [10] = "Bob";
    char *destination = DuplicateString ( source );
    printf ( "%s\n", destination );
    delete destination;
    destination = NULL;
}


Дублирование строки без выделения памяти для новой строки.
Код

#include "stdio.h"
#include "string.h"

void DuplicateString ( char *source ) {
    char *buffer = strdup ( source );
    strcpy ( source + strlen ( source ), buffer );
    delete buffer;
}

void main ( ) {
    char source [10] = "Bob";
    DuplicateString ( source );
    printf ( "%s\n", source );
}


Это сообщение отредактировал(а) adLucem - 5.5.2007, 08:54
PM MAIL ICQ   Вверх
Robin
Дата 5.5.2007, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



если в переменной a достаточно места, почему не просто не скопировать в нее ее саму?
///опередили

Это сообщение отредактировал(а) Robin - 5.5.2007, 08:45
PM MAIL   Вверх
chudik
Дата 5.5.2007, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Видимо я не так выяснилась, что вы меня не поняли.
Мне нужно по программированию написать функцию которая будет копировать любую введеную строку, а то был просто пример.
Тоесть я с клавы ввожу любой текст, а эта функция должна его скопировать. Готовые функции использовать нельзя. функция должна быть написана самостоятельно.
PM MAIL   Вверх
apook
Дата 5.5.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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




Цитата

помогите написать функцию  для дублирования строки


Цитата

Мне нужно по программированию написать функцию


Цитата

 Готовые функции использовать нельзя. функция должна быть написана самостоятельно.


В чем проблема? Тебе что нельзя даже подсматривать как сделаны готовые функции. Или вообще нельзя функцию писать? Или она дол
жна написаться программрй во время выполнения программы smile


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
adLucem
Дата 5.5.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

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



 smile 
Правила форума, которые ВСЕ обязаны соблюдать
Цитата

Заголовок сообщения должен кратко отражать суть проблемы, нельзя давать заголовки типа «Помогите», «Срочно нужна помощь», «Есть вопрос», «Очень надо», «Сложный вопрос по программированию» и тому подобное.


Цитата(chudik @  5.5.2007,  09:58 Найти цитируемый пост)
Видимо я не так выяснилась, что вы меня не поняли.
Мне нужно по программированию написать функцию которая будет копировать любую введеную строку, а то был просто пример.
Тоесть я с клавы ввожу любой текст, а эта функция должна его скопировать. Готовые функции использовать нельзя. функция должна быть написана самостоятельно. 


По моему вы ошиблись - с такими вопросами нужно обращаться в центр помощи.
Цитата

Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".

Или вы считаете, что форум предназначен для написания для вас лабораторных работ по программированию?

Надеюсь вы учтете все вышесказанное в дальнейшем.
 smile 

Решение.
Код

#include "stdio.h"

#define BUFFER_SIZE 100

void main ( ) {
    // Считываем строку
    char *buffer = new char [ BUFFER_SIZE ];
    scanf ( "%s", buffer );

    // Вычисляем длину строки
    int length = 0;
    while ( buffer [ length ] ) {
        length++;
    }

    // Дублируем строку
    for ( int i = 0; i < length; i++ ) {
        buffer [ length + i ] = buffer [ i ];
    }
    buffer [ length * 2 ] = 0;

    // Выводим результат
    printf ( "%s\n", buffer );

    // Уничтожаем строку
    delete buffer;
}


Забавные варианты (детям до 16 лет использование запрещено smile )
Код

#include "stdio.h"
#include "malloc.h"

#define BUFFER_SIZE 100

void main ( ) {
    char *buffer = ( char* ) malloc ( sizeof ( char ) * BUFFER_SIZE );
    scanf ( "%s", buffer );

    int length = 0;
    while ( buffer [ ++length ] );
    int i = 0;
    while ( ( buffer [ length + i ] = buffer [ i ] ) && ( i++ < length ) );
    buffer [ length * 2 ] = 0;

    printf ( "%s\n", buffer );
    free ( buffer );
}


Код

#include "stdio.h"
#include "malloc.h"
#include "memory.h"

#define BUFFER_SIZE 100

void main ( ) {
    char *buffer = ( char* ) malloc ( sizeof ( char ) * BUFFER_SIZE );
    scanf ( "%s", buffer );

    int length = 0;
    while ( buffer [ ++length ] );
    memcpy ( buffer + length, buffer, length + 1 );

    printf ( "%s\n", buffer );
    free ( buffer );
}


Только на указателях (с контролем длины вводимой строки).
Код


#include "stdio.h"
#include "conio.h"
#include "malloc.h"

#define BUFFER_SIZE 100

void main ( ) {
    char *buffer = ( char* ) malloc ( sizeof ( char ) * BUFFER_SIZE );

    char *src = buffer - 1;
    while ( ( ++src < buffer + BUFFER_SIZE / 2 - 1 )
        && ( ( *src = getch ( ) ) != 0xD ) );
    char * dest = src;
    while ( ( dest - src < src - buffer )
        && ( *dest++ = buffer [ dest - src ] ) );
    *dest = 0;

    printf ( "%s", buffer );
    free ( buffer );
}


А кто-нибудь может это сделать менее чем на трех переменных (тип не имеет значения)?

Это сообщение отредактировал(а) adLucem - 6.5.2007, 11:52
PM MAIL ICQ   Вверх
JackYF
Дата 6.5.2007, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(adLucem @  5.5.2007,  12:25 Найти цитируемый пост)
детям до 16 лет

Не согласен. До 14. smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
ama_kid
Дата 6.5.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



В качестве дополнения решения от adLucem (если все-таки дублирование строки надо сделать функцией):
Код
#include "stdio.h"
#define BUFFER_SIZE 100

char * StrDup(char *s, char *buf)
{
 // Вычисляем длину строки
 int length = 0;
 while ( s[ length ] ) length++;
 // Дублируем строку
 for ( int i = 0; i < length; i++ )
 { 
   buf [ i ] = s[ i ];
   buf [ length + i ] = buf [ i ];
 }
 buf [ length * 2 ] = 0;
 //Возвращаем указатель на сформированный буфер
 return buf;
}

void main ( ) 
{
    // Считываем строку
    char *bufferIn = new char [ BUFFER_SIZE ];
    char *bufferOut = new char [ BUFFER_SIZE ];
    char *pBufOut;
    scanf ( "%s", bufferIn );
    // Вызываем функцию дублирования строки
    pBufOut = StrDup(bufferIn,bufferOut);
    // Выводим результат
    printf ( "%s\n", pBufOut );
    // Уничтожаем строки
    delete bufferIn;
    delete bufferOut;
}


Цитата(adLucem @  5.5.2007,  12:25 Найти цитируемый пост)
детям до 16 лет использование запрещено
Не согласен - пусть учатся с пелёнок   smile 


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
nickless
Дата 6.5.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

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



Цитата(adLucem @  5.5.2007,  11:25 Найти цитируемый пост)
А кто-нибудь может это сделать менее чем на трех переменных (тип не имеет значения)?

Чтоб только на указателях?
Вот на двух char*-ах smile 
Код
#include "stdio.h"
#include "malloc.h"

#define BUFFER_SIZE 100

int main ()
{
    char* buffer = ( char* ) malloc ( sizeof ( char ) * BUFFER_SIZE );
    char* src = buffer - 1;

    while (( ++src < buffer + BUFFER_SIZE / 2 - 1 ) && ( (*src = getchar()) != 0xA ))
        ;
    *src = 0xA;

    while ( (*++src = *++buffer) != 0xA )
        ;
    *src = 0;
    src -= 2*(src-buffer);
    *buffer = *src;
    buffer = src;

    printf("%s\n", buffer);
    free ( buffer );
    return 0;
}



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
adLucem
Дата 6.5.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

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



nickless, зачтено

Немного переработанный код.
Код

void main ( ) {
    char* buffer = ( char* ) malloc ( sizeof ( char ) * BUFFER_SIZE );

    char* src = buffer - 1;
    while ( ( ++src < buffer + BUFFER_SIZE / 2 - 1 ) 
        && ( (*src = getchar ( ) ) != 0xA ) );
    *src = 0;
    while ( ( *++src = *++buffer ) );
    *buffer = * ( buffer - ( src - buffer ) );
    buffer = buffer - ( src - buffer );

    printf("%s", buffer);
    free ( buffer );
}


Интересно, а еще можно уменьшить количество переменных  smile или количество строк кода (имеется в виду не за счет сведения двух строк в одну)?

Это сообщение отредактировал(а) adLucem - 6.5.2007, 14:30
PM MAIL ICQ   Вверх
Dov
Дата 6.5.2007, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Сложно у вас как-то, ребяты! Аж в глазах рябит.  smile  Имхо, по-проще нада делать.  smile 
Код
int main()
{
    char source[100];    

    cin.getline(source, 100);    
    for(int len = 0; source[len]; len++);
    for(int i = len; i >= 0; i--)
        source[i + len] = source[i];
    
    cout << source << endl;
    return 0;
}

 smile 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
adLucem
Дата 7.5.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

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



Dov, проверяйте ваш код перед публикацией  smile  :
Код

int main()
{
    char source[100];    
    cin.getline(source, 100);    
    for(int len = 0; source[len]; len++); // len объявлен только в области видимости данного цикла
    for(int i = len; i >= 0; i--) // ошибка компилятора error C2065: 'len' : undeclared identifier

        source[i + len] = source[i];
    
    cout << source << endl;
    return 0;
}


И еще - перед тем как упрощать (хотя что именно вы упростили непонятно) знакомтесь со всеми приведенными вариантами, то что вы предлагаете ничем не отличается моего кода, который был предложен как самый простой вариант (кроме использования статического массива и cin).

Это сообщение отредактировал(а) adLucem - 7.5.2007, 11:11
PM MAIL ICQ   Вверх
betal
Дата 7.5.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(chudik @  5.5.2007,  01:12 Найти цитируемый пост)
помогите написать функцию  для дублирования строки
например: "боб" -> "боббоб" 

проще всего делать двойной вывод в этом случае smile 
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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