1

Тема: Аналог функції copy в С++

Підкажіть, будь ласка, аналог паскалівської функції copy в С++. Я знайшов в бібліотеці string функцію memcpy, але  вона не призначена для копіювання конкретної кількості символів з конкретної позиції в рядку. А мені потрібно саме це. Як в С++ це реалізується?

2

Re: Аналог функції copy в С++

В С++ своя модель роботи з рядками, і не одна. Вам чи то std::string::substr, чи то strncpy треба...

Подякували: illia1

3

Re: Аналог функції copy в С++

koala написав:

В С++ своя модель роботи з рядками, і не одна. Вам чи то std::string::substr, чи то strncpy треба...

strncpy копіює визначену кількість символів починаючи з першого з одного рядка в інший. А що робити, якщо треба скопіювати починаючи не з першого символу?

4

Re: Аналог функції copy в С++

Додати до вказівника на char потрібну цифру

Бодай вас Бог любив, а мене – молодиці!
Подякували: koala1

Re: Аналог функції copy в С++

illia написав:
koala написав:

В С++ своя модель роботи з рядками, і не одна. Вам чи то std::string::substr, чи то strncpy треба...

strncpy копіює визначену кількість символів починаючи з першого з одного рядка в інший. А що робити, якщо треба скопіювати починаючи не з першого символу?

Здається substr можна вказувати з якого символу починати.

6

Re: Аналог функції copy в С++

Очі.завидющі написав:

Додати до вказівника на char потрібну цифру

Можете пояснити на прикладі?

7 Востаннє редагувалося Очі.завидющі (12.06.2013 22:44:38)

Re: Аналог функції copy в С++

char *p; //наш вказівник
p+=5; // зсунути на 5 символів

навіть якщо ваш символ юнікодний(УТФ-16, 2 байти на символ), то воно все одно посунеться, але вже на 10 байт, але все одно на 5 символів.

Бодай вас Бог любив, а мене – молодиці!

8

Re: Аналог функції copy в С++

illia написав:

Я знайшов в бібліотеці string функцію memcpy, але  вона не призначена для копіювання конкретної кількості символів з конкретної позиції в рядку.

Та невже?)

#include <cstdio>
#include <cstring>

int main()
{
    char *src = "String for example.";
    char buf[1024]={0};
    //Imagine - I wanna copy everything from the word 'for'...
    //Here I make a determined point - you may do it by strstr()
    int pos = 7;
    
    memcpy(buf, &src[7], strlen(&src[7]));
    
    printf("Source: %s\nResult: %s\n", src, buf);
    
    return 0;
}
Прихований текст
http://osidok.pp.ua/images/2013/06/12/example.png
I belong to the Dead Generation.
Подякували: Cyan, Replace, illia, Chemist-i4

9

Re: Аналог функції copy в С++

Вже кілька годин не можу доробити задачу. =( Підкажіть, будь ласка, де помилка. Тільки не треба казати мені, що це завдання можна зробити інакше і писати новий код, підкажіть де помилка в моєму кривому коді.

Завдання:
Кожний рядок файлу містить два слова: перше слово – англійською мовою, друге – переклад першого слова українською мовою. Написати програму для перекладу слова з англійської мови із використанням такого файлу.

Код:

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <cstdio>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    char s[256], s1, s2, buf[256]={0};
    int i;
    char *src;
    ifstream f;
    printf("Input world in English: "); scanf("%s", &s1);
    f.open("fruit.txt"); 
    while (!f.eof())
    {    
         f.getline(s, 256);
         i=0;
         s2=*""; 
         if (s[i]!=' ')
         {     
               s2=s2+s[i];
               i++;            
         }
         src=s;
         if (s1==s2)
         {
                    memcpy(buf, &src[i], strlen(&src[i]));
                    printf("Translating: %s\n", buf);
         }   
    }
    f.close();
    system("PAUSE");
    return EXIT_SUCCESS;
}

вміст файлу fruit.txt:
apple yabluko
pear grusha
orange apelsyn
banana banan
pineapple ananas
coco kokos
plum slyva
cherry vyshnya
strawberry polunytsya
merry chereshnya

результат виконання програми:
http://radikal.ua/data/upload/49112/05615/8f9326e66b.jpg

10

Re: Аналог функції copy в С++

char ... s1...;
...
scanf("%s", &s1);

s1 - символ. В адресу s1 зчитується рядок, тобто в s1- перший знак, а решта - абикуди в пам'ять (швидше за все - в s2 і buf, але не гарантовано, тут НП).
Де помилка - вказав, а як виправити - ви ж просили не казати...

11

Re: Аналог функції copy в С++

koala написав:

Де помилка - вказав, а як виправити - ви ж просили не казати...

Я мав на увазі не виправляти повністю весь код. Якщо вам не важко - підкажіть виправлення. Я пробував надати s1 і s2 значення масивів (s1[256] і s2[256]), то у мене потім виникала проблема з обнуленням значення s2 і ще купа помилок, через які я дуже заплутався.

12

Re: Аналог функції copy в С++

illia, от кілька моментів:

1. scanf() зчитує дані і записує до певного блоку пам'яті. Якщо ви читаєте рядок %s, то й записуйте його до масиву s1[256]. Можете прописати

char s1[256]={0};

2. Алгоритм мені незрозумілий. Вам же треба друге слово витягти? Логіка використання s2 туманна тут...

I belong to the Dead Generation.
Подякували: koala1

13

Re: Аналог функції copy в С++

Bartash написав:

2. Алгоритм мені незрозумілий. Вам же треба друге слово витягти? Логіка використання s2 туманна тут...

в s2 вставляються по одній літери кожного рядку, доки не потрапляємо на символ " " (пробіл). потім я перевіряю умову рівності між s1 і s2 і лише тоді витягую друге слово

14

Re: Аналог функції copy в С++

illia написав:

в s2 вставляються по одній літери

s2 - це один символ, одна літера. Як в одну літеру можна вставити кілька?

Подякували: Bartash1

15

Re: Аналог функції copy в С++

illia написав:

в s2 вставляються по одній літери кожного рядку, доки не потрапляємо на символ " " (пробіл). потім я перевіряю умову рівності між s1 і s2 і лише тоді витягую друге слово

Ви на кожній ітерації циклу перезаписуєте змінну s2 новим символом.
Якщо вам треба знайти слово після пробілу, спробуйте оце:

char *s = s1;
//....
//десь у тілі циклу проходження по файлу...

while(s && s!=' ') s++;
if(s++)
{
//тут s вказує на друге слово
}
else
{
//файл пошкоджений - другого слова взагалі нема
}
I belong to the Dead Generation.

16

Re: Аналог функції copy в С++

Bartash написав:

Ви на кожній ітерації циклу перезаписуєте змінну s2 новим символом.
Якщо вам треба знайти слово після пробілу, спробуйте оце:

Мені треба в s2 загнати слово до пробілу зі словника. І от з цим у мене зараз проблема. Якщо це слово в результаті співпаде з введеним з клавіатури s1, тоді я вивожу на екран переклад слова (те що в словнику після пробілу). Але це наче працює.

17

Re: Аналог функції copy в С++

illia написав:

Мені треба в s2 загнати слово до пробілу зі словника. І от з цим у мене зараз проблема. Якщо це слово в результаті співпаде з введеним з клавіатури s1, тоді я вивожу на екран переклад слова (те що в словнику після пробілу). Але це наче працює.

Тоді s2 має бути рядком, а не символом.

З.І: Код варто стерти і написати з нуля. Серйозно. На чисту голову. :)

I belong to the Dead Generation.
Подякували: illia1

18

Re: Аналог функції copy в С++

А є якась функція яка просто перевіряє входження одного рядку в інший?

19

Re: Аналог функції copy в С++

strstr
std::string::find

Подякували: Bartash, illia2

20

Re: Аналог функції copy в С++

Якщо комусь цікаво, то у мене таки вийшов робочий варіант.

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <cstdio>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    char s[256], s1[256]={0}, buf[256]={0};
    int i;
    char *src;
    ifstream f;
    printf("Input world in English: "); scanf("%s", &s1);
    f.open("fruit.txt"); 
    while (!f.eof())
    {    
         f.getline(s, 256);
         i=0; 
         while (s[i]!=*" ") i++;           
         src=s;
         if (strstr(s, s1)!=0)  
         {
                    memcpy(buf, &src[i+1], strlen(&src[i]));
                    printf("Translating: %s\n", buf);
         }   
    }
    f.close();
    system("PAUSE");
    return EXIT_SUCCESS;
}
Подякували: Bartash, Chemist-i, koala3