Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: char копирование строки  (Прочитано 36575 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Aleexeey
Постоялец

ru
Offline Offline

« : 13-07-2008 17:41 » 

Доброго времени суток!
Откликнитесь кто может: как скопировать из одной строки с позиции "X" и длинной "Y" в другую!

Например, как:
strncpy(строка_получатель, строка2_источник, число_длины);
только "строка_получатель" должен получить текст не сначала строки.

Спасибо заранее!
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 13-07-2008 17:51 » 

Код:
strncpy(строка_получатель, строка2_источник+X, Y);
- что-то такое?
Записан
Aleexeey
Постоялец

ru
Offline Offline

« Ответ #2 : 13-07-2008 18:00 » 

Спасибо Вад!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 14-07-2008 14:05 » 

ага, только длину надо учесть )


strncpy(строка_получатель, строка2_источник+X, min (Y,максимальная_длина_строки_получателя) );
Записан

Aleexeey
Постоялец

ru
Offline Offline

« Ответ #4 : 14-07-2008 17:18 » 

Спасибо, Алексей1153++! я не ожидал, что так скоро ответят, и столь точно, на вопрос!

Все работает! Спасибо Вам!!!  Улыбаюсь
Записан
vananabu
Интересующийся

ru
Offline Offline

« Ответ #5 : 26-04-2011 15:52 » 

Помогите, пожалуйста, найти ошибку!
Программа по идее из строки выделяет последовательно по два символа, переводит их в числа (считываются как 16-ричные) и записывает в массив.
Не так как надо работает ф-ция strncpy, а точнее вообще не работает:


Код:
#include <iostream>
#include <conio.h>
#include <string>
#include <cstring>

using namespace std;

int main()
{   int k=0,i,j,Nk=4,Nr=10,Nb=4;
long f[4][45];
    char *temp,*end_ptr,*key;
key="2b7e151628aed2a6abf7158809cf4f3c";
for (i=0;i<Nk;i++)
{
for (j=0;j<Nk;j++)
{
strncpy(temp,key+k*2,2);
f[i][j]=strtol(temp,&end_ptr,16);
k++;
}
}
//cout<<f[0][0];
_getch();
return 0;
}

Добавлено через 2 минуты и 41 секунду:
прошу прощения, вот так:

Код:
#include <iostream>
#include <conio.h>
#include <string>
#include <cstring>

using namespace std;

int main()
{   int k=0,i,j,Nk=4,Nr=10,Nb=4;
long f[4][45];
    char *temp,*end_ptr,*key;
key="2b7e151628aed2a6abf7158809cf4f3c";
for (i=0;i<Nk;i++)
{
for (j=0;j<Nk;j++)
{
strncpy(temp,key+k*2,2);
f[i][j]=strtol(temp,&end_ptr,16);
k++;
}
}
_getch();
return 0;
}
« Последнее редактирование: 26-04-2011 19:15 от Вад » Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 26-04-2011 16:49 » 

точно strncpy?
меня смущает:
long f[4][45];
...
for (j=0;j<Nk;j++){
   f[j]=
« Последнее редактирование: 26-04-2011 16:52 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
vananabu
Интересующийся

ru
Offline Offline

« Ответ #7 : 26-04-2011 19:04 » 

Все решил вот так:

Код:
for (j=0;j<Nk;j++)
{
strncpy(buf,key+k*2,2);
temp=buf;
f[i][j]=strtol(temp,&end_ptr,16);
cout<<f[i][j];
k++;
}
Но при этом пишет об опасности использования ф-ции "strncpy" и успешно выполняет)
« Последнее редактирование: 26-04-2011 19:16 от Вад » Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 26-04-2011 20:10 » 

действительно Здесь была моя ладья...... temp был указателем в никуда)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #9 : 26-04-2011 23:02 » 

Код:
#include <iostream>
#include <conio.h>
#include <string>
#include <cstring>

using namespace std;

int main()
{
int offset = 0;
long f[4][4];
char *end_ptr, *key = "2b7e151628aed2a6abf7158809cf4f3c";
char temp[3];

for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
{
strncpy(temp, key + offset, 2);
f[i][j] = strtol(temp, &end_ptr, 16);
offset += 2;
}
}

_getch();

return 0;
}

действительно Здесь была моя ладья...... temp был указателем в никуда)
vananabu, тебе стоит обратить на это внимание.
« Последнее редактирование: 26-04-2011 23:04 от Dr.Y » Записан
vananabu
Интересующийся

ru
Offline Offline

« Ответ #10 : 28-04-2011 19:10 » 

Dr.Y, я так сразу и писал без buf, но ф-ция выдавала ошибку именно на этом аргументе, поэтому пришлось через указатель и buf. Насчет массива и др. переменных, то они будут использоваться дальше, это лишь кусок программы. Все равно спасибо за помощь!
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #11 : 29-04-2011 03:26 » 

народ вы доки читаете? хоть иногда?
strncpy не добавляет терминирующий ноль, если копируемая строка больше, чем переданное в третьем парметре колличество символов
http://www.cplusplus.com/reference/clibrary/cstring/strncpy/
добавьте
Код:
temp[2] = 0;


Добавлено через 7 минут и 22 секунды:
ну и к качеству кода есть притензии
« Последнее редактирование: 29-04-2011 03:33 от LogRus » Записан

Странно всё это....
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 29-04-2011 07:25 » 

А ещё лучше, перед копированием, обнулять содержимое буфера. Тогда не надо заморачиваться, на каком месте 0 ставить.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #13 : 30-04-2011 10:18 » 

Джон, этоне работает, если поверх нулей запушут данные (не безопасный strcpy например)
имхо в большенстве случаем достаточно после копирования поставить 0 в последний байт буфера, да и гораздо быстрее
можно еще поиспользовать strfcpy, но она есть не везде
Записан

Странно всё это....
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 30-04-2011 18:01 » 

Не понял? Что значит "поверх нулей запушут данные"? Я же сказал, ПЕРЕД копированием, непосредственно. А это работает всегда без всяких "если". В любом случае, следующий байт после последнего скопированного будет 0.
Да и вобще, инициаллизирование переменных - есть правило хорошего тона. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #15 : 05-05-2011 18:20 » new

ну чего тут не понятного Улыбаюсь
массив получатель char A[5] перед копирование заполняем нулями
копируем "безопасной" функцией strncpy строку "bla-bla-bla" и указываем в качестве максимального колличества данный sizeof(A)
получаем, что все наши нолики затёрты данными

тоже самое в коде
Код: (C++)
char a[5] = {0};
char b[] = "bla-bla-bla";
strcpy(a, b, sizeof(a));

и получается, что:
- мы зря выполняли самую дорогую операцию, т.е. запись в память
- это никак нас не защитило от затерания терминирующего нуля
- если бы мы занули только первый байт у массива "a", то эффекты был бы тотже, но массив можно считать инициализированным
« Последнее редактирование: 05-05-2011 18:36 от Антон (LogRus) » Записан

Странно всё это....
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #16 : 06-05-2011 05:47 » 

Используйте функцию strlcpy(), там где она есть (как вариант свою реализацию оной), в ней данные проблемы решены, ну или snprintf() на худой конец.
« Последнее редактирование: 06-05-2011 05:49 от darkelf » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines