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

Ваш аккаунт

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

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

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

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

271
04 марта 2007 года
MrXaK
721 / / 31.12.2002
была задача скопировать строку s1 в строку s n раз (друг за другом как понимаю)
написал:
 
Код:
void Copies(char *s, char *s1, int n)
{
 int p = 0, q = strlen(s1);
 for( int i = 0; i < n; i++)
   for( int j = 0; j < q; j++, s[p++]=s1[j] )
}

но так как компилятора в данный момент под рукой нету то не уверен что это будет работать) так что прошу - проверьте, работает ли, а если нет, то дайте свой вариант)
9
04 марта 2007 года
Lerkin
3.0K / / 25.03.2003
Это типа, конкатенация такая специфическая ;)
 
Код:
void strncat(char* dst, char* src, int n)
{
    while( n-- )
    {
        char* p = src;
        while( *dst++ = *p++ );
    }
}
15K
04 марта 2007 года
Sara
79 / / 04.01.2007
Мистер Хакер, не работает Ваша функция.
Ошибки перечислять не буду, лучше сразу напишу правильный вариант (который, к тому же, еще и короче на две строки! :D )
 
Код:
void Copies(char *s, char *s1, int n)
{
  for(int i = 0; i < n; i++) strcpy(s+i*strlen(s1), s1);
}
271
04 марта 2007 года
MrXaK
721 / / 31.12.2002
ага, спасибо)
271
04 марта 2007 года
MrXaK
721 / / 31.12.2002
2Lerkin не работает твой вариант, он только один раз копирует... мой вариант (исправленный, если вынести s[p++]=s1[j] из 3го параметра в сам for) почти работает)) плюс на твою функцию выдаётся варнинг при компиляции...
код
Код:
#include <stdio.h>
#include <string.h>

void Copies(char *s, char *s1, int n)
{
 int p = 0, q = strlen(s1);
 for( int i = 0; i < n; i++)
   for( int j = 0; j < q; j++) s[p++]=s1[j];
}

void strncat(char* dst, char* src, int n)
{
    while( n-- )
    {
        char* p = src;
        while( *dst++ = *p++ );
    }
}

void copies(char *s, char *s1, int n)
{
  for(int i = 0; i < n; i++) strcpy(s+i*strlen(s1), s1);
}

int main( void )
{
    unsigned int num = 2;
    char a[] = "asd";
    char *b;
    b = new char[strlen(a)*num];
    printf("%s\n", a);
    Copies(b, a, 2);
    printf("1: %s\n", b);
    strncat(b, a, 2);
    printf("2: %s\n", b);
    copies(b, a, 2);
    printf("3: %s\n", b);
    return 0;
}

компилятор выдаёт
 
Код:
Borland C++ 5.6 for Win32 Copyright (c) 1993, 2002 Borland
strcpyn.cpp:
Warning W8060 strcpyn.cpp 16: Possibly incorrect assignment in function strncat(char *,char *,int)
Turbo Incremental Link 5.60 Copyright (c) 1997-2002 Borland

результат
 
Код:
asd
1: asdasd@
2: asd
3: asdasd

но всё равно всем спасибо)
з.ы. кстати, объясните, почему
for( int j = 0; j < q; j++) s[p++]=s1[j]; работает, а for( int j = 0; j < q; j++, s[p++]=s1[j]); - нет... по идее должно работать))
242
05 марта 2007 года
Оlga
2.2K / / 04.02.2006
Цитата:
2Lerkin не работает твой вариант


так работает, только вопрос: чем тебе стандартные функции не угодили(хотя бы пример Сары смотри).

Код:
void _strncat(char* dst, char* src, int n)
{
 char *temp = dst;
    while( n-- )
    {
        char* p = src;
        while(*p)
             *dst++ = *p++;
     }
 *dst = 0;
}
15K
05 марта 2007 года
Sara
79 / / 04.01.2007
Цитата: Mr.Hacker
з.ы. кстати, объясните, почему
for( int j = 0; j < q; j++) s[p++]=s1[j]; работает, а for( int j = 0; j < q; j++, s[p++]=s1[j]); - нет... по идее должно работать))


Объяснение очень простое. В первом случае сначала j=0, потом выполняется s[p++]=s1[j] и только после этого j увеличивается на 1, а во втором случае у тебя сначала идет j++, а потом s[p++]=s1[j], т.е. первый символ пропускается.

А вот этот мусор в конце строки "asdasd@" - результат того, что ты забыл добавить нулевой символ.

9
05 марта 2007 года
Lerkin
3.0K / / 25.03.2003
2Mr.Hacker: Она работает, просто соединяет вместе с \0 :) Пропустил кое-что, надо поправить:
 
Код:
void strncat(char* dst, char* src, int n)
{
    while( n-- )
    {
        while( *dst++ = *src++ );
        dst--;
    }
}

Так работает.
271
05 марта 2007 года
MrXaK
721 / / 31.12.2002
ага, всем спасибо)
2OlgaKr насчёт стандартных всё хорошо, просто самому интересно как ещё можно реализовать)
59K
20 марта 2010 года
NataLLLi
1 / / 20.03.2010
интересно а почему можно копировать только 2 раза и не более?:confused:

unsigned int num = 2;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог