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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помощь в написании функций, Написание строковых функций 
:(
    Опции темы
babat
Дата 6.11.2011, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите написать функции для работы со строками)
Я несколько написал,но не работают как надо.
1)int strlen(char*s)
2)char*strcpy(char*dest,char*s,int p,int k)
3)char*strdel(char*s,int p,int k)
4)char*strins(char*sub,char*s,int p)
5)int strpos(char*sub,char*s)
6)int strcmp(char*s1,char*s2)
7)char*strcat(char*dest,char*s1,char*s2)
1) strlen -длина строки
2) strcpy-помещает в dest K символов строки S,начиная с Р-го
3) strdel- Удаляет из S K символов,начиная с Р-го
4) strins -  вставляет sub в s с р-й позиции,с предположением,что в S достаточно места
5) strpos - возвращает позицию 1-го вхождения sub в s или -1
6) strcmp- возвращает 0 если строки равны,1 если s1>s2,-1 если s1<s2
7) strcat- Сцепляет s1 и s2 и помещает их в dest  
Задание:реализовать 6 из 7 функции в 4х вариантах каждую.
Вот написал
Код

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

char*strcpy1(char*dest,char*s,int p,int k)
{
    for (int i=p,j=0;i<p+k;++i,++j)
        dest[j]=s[i];
    return dest;
}
void main()
{
    int k=4,p=3;
    char s[15]="123123412",dest[15];
    printf ("strcpy1(\"%s\",\"%i\",\"%i\")=\"%s\"\n",s,p,k,strcpy1(dest,s,p,k));
    getch();
}

Это без проверок всяких.Почему мусор какой-то выводит?

Это сообщение отредактировал(а) babat - 6.11.2011, 18:23
PM MAIL   Вверх
tzirechnoy
Дата 6.11.2011, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

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



Как минимум строка не завершэна '\0'. Но, не зная задание, не могу сказать -- это ошыбка реализацыи strcpy1 или Вы неправильно пытаетесь его использовать.
PM MAIL   Вверх
babat
Дата 6.11.2011, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1) strlen -длина строки
2) strcpy-помещает в dest K символов строки S,начиная с Р-го
3) strdel- Удаляет из S K символов,начиная с Р-го
4) strins -  вставляет sub в s с р-й позиции,с предположением,что в S достаточно места
5) strpos - возвращает позицию 1-го вхождения sub в s или -1
6) strcmp- возвращает 0 если строки равны,1 если s1>s2,-1 если s1<s2
7) strcat- Сцепляет s1 и s2 и помещает их в dest 
PM MAIL   Вверх
borisbn
Дата 6.11.2011, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Код

char*strcpy1(char*dest,char*s,int p,int k)
{
    for (int i=p,j=0;i<p+k;++i,++j)
        dest[j]=s[i];
    dest[k]=0;  // <---
    return dest;
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
babat
Дата 6.11.2011, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо,понятно)) видимо я еще не до уонца от паскаля отцепился(
еще вопрос. Почему размер массива нельзя задавать таким способом :
int k=10;
char s[k];
 или
char s[]="12334";
char s1[strlen(s)+1];
PM MAIL   Вверх
volatile
Дата 6.11.2011, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(babat @  6.11.2011,  11:49 Найти цитируемый пост)
Почему размер массива нельзя задавать таким способом :

Кое-где можно
http://liveworkspace.org/code/5adb082f5001...274d2a304352625
PM MAIL   Вверх
borisbn
Дата 6.11.2011, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(volatile @  6.11.2011,  12:49 Найти цитируемый пост)
Кое-где можно

хммм. как это ? там же "галочка" на Си++, а не на Си стоит  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 6.11.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(borisbn @  6.11.2011,  16:09 Найти цитируемый пост)
там же "галочка" на Си++, а не на Си стоит    


borisbn, Ну во первых, я здесь не увидел нигде упоминания, что нужен именно С.

Ну, а раз так, то лёгким движение руки.... программка превращается....превращается... 

http://liveworkspace.org/code/4358235b7ac9...246f38227a92e31

smile 
PM MAIL   Вверх
babat
Дата 6.11.2011, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код


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

char*strins1(char*sub,char*s,int p)
{
    int len=strlen(sub),len1=strlen(s);
    char s1[100];
    for (int i=p,j=0;i<len1;++i,++j)
        s1[j]=s[i];
    s1[len1-p]=0;
    for (int i=p,j=0;i<len+p;++i,++j)
        s[i]=sub[j];
    for (int i=p+len,j=0;i<len+len1;++i,++j)
        s[i]=s1[j];
    s[len+len1]=0;
    return(s);
}
void main()
{
     int p=3;
    char s[15]="123789",sub[15]="456";
    printf("strins1(\"%s\",\"%s\",\"%i\")=\"%s\"\n",sub,s,p,strins1(sub,s,p));
    getch();
}

Почему в строке вывода ,где должно изначальное значение s выводиться,выводится strins?
Код


char*strdel1(char*s,int p,int k)
{
    int len=strlen(s);
    char s1[100];
    for (int i=p+k,j=0;i<len;++i,++j)
        s1[j]=s[i];
    for (int i=p,j=0;i<len-k;++i,++j)
        s[i]=s1[j];
    s[len-k]=0;
    return s;
}

void main()
{
    int p=3,k=4;
    char s[15]="1234567456";
    printf ("strdel1(\"%s\",\"%i\",\"%i\")=\"%s\"\n",s,p,k,strdel1(s,p,k));
    getch();
}

Здесь такой-же вопрос

++ помогите исправить:
Код

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

int strpos1(char*sub,char*s)
{
    int v,len=strlen(s),len1=strlen(sub);
    int p;
    for (int i=0,j=0;i<len;++i,++j)
    {
        if (s[i]=sub[j]) {
             p=i;
            for (int k=1,k1=j;k<len1;)
                if (s[k1]=sub[k])
                {
                    ++k;
                    ++k1;
                    if (k==(len1-1)) break;
                }
                else p=-1;
        }
    
    }
    return p;
}

void main()
{
    char sub[10]="123",s[15]="45512364";
    printf ("strpos1(\"%s\",\"%s\")=\"%i\"\n",sub,s,strpos1(sub,s));
    getch();
}


Это сообщение отредактировал(а) babat - 6.11.2011, 20:27
PM MAIL   Вверх
borisbn
Дата 6.11.2011, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(volatile @  6.11.2011,  16:30 Найти цитируемый пост)
Ну во первых, я здесь не увидел нигде упоминания, что нужен именно С.

volatile, я, почему-то, был уверен, что эти "фокусы" возможны только в Си, а в Си++ такое невозможно...


babat, в ф-ции strins1
Цитата(babat @  6.11.2011,  18:54 Найти цитируемый пост)
 for (int i=p,j=0;i<len1;++i,++j)

почему копирование в выходную строку начинается с i=p ???
должно быть так:
1) скопировать в выходную строку из входной с 0 до p-1
2) добавить к выходной строке подстроку (sub)
3) добавить к выходной строке входную от p до конца входной

в ф-ции strdel1 будь проще и к тебе потянутся smile
Код

char * strdel1( char * s, int p, int k )
{
    int len = strlen(s);
    char s1[100];
    for ( int i = p, j = p + k; j < len; ++i, ++j )
        s[ i ] = s[ j ];
    s[ len - k ] = 0;
    return s;
}


в ф-ции strpos1 вообще всё неправильно. нужно как-то так
Код

int strpos1(char*sub,char*s)
{
    int len=strlen(s),len1=strlen(sub);
    int p = -1;
    for ( int i = 0; i < len; ++i )
    {
        if ( s[ i ] == sub[ 0 ] ) {
            p = i;
            for ( int k = i + 1, k1 = 1; k < len && k1 < len1; )
                if ( s[ k ] == sub[ k1 ] )
                {
                    ++k;
                    ++k1;
                }
                else
                {
                    p = -1;
                    break;
                } 
        }
    
    }
    return p;
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 7.11.2011, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(borisbn @  6.11.2011,  21:50 Найти цитируемый пост)
а в Си++ такое невозможно

на сайте у бусткодера возможно всё!  smile 
PM MAIL   Вверх
babat
Дата 7.11.2011, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(borisbn @ 6.11.2011,  21:50)

babat, в ф-ции strins1
Цитата(babat @  6.11.2011,  18:54 Найти цитируемый пост)
 for (int i=p,j=0;i<len1;++i,++j)

почему копирование в выходную строку начинается с i=p ???
должно быть так:
1) скопировать в выходную строку из входной с 0 до p-1
2) добавить к выходной строке подстроку (sub)
3) добавить к выходной строке входную от p до конца входной


Здесь же S и есть выходная строка,а  вот этим for (int i=p,j=0;i<len1;++i,++j) я копирую в s1 строку s начиная с Р-й позиции.А потом с Р-й позиции в S я заталкиваю Sub. Затем С позиции P+strlen(sub) я заталкиваю S1. Вроде как правильно,но в строке вывода
printf("strins1(\"%s\",\"%s\",\"%i\")=\"%s\"\n",sub,s,p,strins1(sub,s,p));
 Должно выводиться вот так : strins1("456","123789","3")="123456789"
А выводит вот так: strins1("456","123456789","3")="123456789"
Почему?((

Народ,HELP!

Это сообщение отредактировал(а) babat - 8.11.2011, 14:52
PM MAIL   Вверх
borisbn
Дата 8.11.2011, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



babat, ты изменяешь первоначальную строку, а т.к. параметры в ф-цию printf передаются с конца, то сначала выполнится strins1(sub,s,p) - при этом s изменится - затем её результат передастся в printf, затем туда передастся p, а затем s (как ты помнишь - изменённое)


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 8.11.2011, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(borisbn @  8.11.2011,  17:57 Найти цитируемый пост)
параметры в ф-цию printf передаются с конца

Это implementation defined, нет?  smile 

А вообще данная ситуация называется "undefined behaviour" - неопределенное поведение.
PM   Вверх
borisbn
Дата 8.11.2011, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(bsa @  8.11.2011,  17:28 Найти цитируемый пост)
Это implementation defined, нет?

почти уверен, что да. и судя по implementation'у babat у него defined именно так smile

и опять соглашусь: такой код - прямой путь к UB.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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