Aleexeey
Постоялец
Offline
|
|
« : 13-07-2008 17:41 » |
|
Доброго времени суток! Откликнитесь кто может: как скопировать из одной строки с позиции "X" и длинной "Y" в другую!
Например, как: strncpy(строка_получатель, строка2_источник, число_длины); только "строка_получатель" должен получить текст не сначала строки.
Спасибо заранее!
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #1 : 13-07-2008 17:51 » |
|
strncpy(строка_получатель, строка2_источник+X, Y); - что-то такое?
|
|
|
Записан
|
|
|
|
Aleexeey
Постоялец
Offline
|
|
« Ответ #2 : 13-07-2008 18:00 » |
|
Спасибо Вад!
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 14-07-2008 14:05 » |
|
ага, только длину надо учесть )
strncpy(строка_получатель, строка2_источник+X, min (Y,максимальная_длина_строки_получателя) );
|
|
|
Записан
|
|
|
|
Aleexeey
Постоялец
Offline
|
|
« Ответ #4 : 14-07-2008 17:18 » |
|
Спасибо, Алексей1153++! я не ожидал, что так скоро ответят, и столь точно, на вопрос! Все работает! Спасибо Вам!!!
|
|
|
Записан
|
|
|
|
vananabu
Интересующийся
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
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
vananabu
Интересующийся
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
|
|
« Ответ #8 : 26-04-2011 20:10 » |
|
действительно ... temp был указателем в никуда)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Dr.Yevhenius
|
|
« Ответ #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
Интересующийся
Offline
|
|
« Ответ #10 : 28-04-2011 19:10 » |
|
Dr.Y, я так сразу и писал без buf, но ф-ция выдавала ошибку именно на этом аргументе, поэтому пришлось через указатель и buf. Насчет массива и др. переменных, то они будут использоваться дальше, это лишь кусок программы. Все равно спасибо за помощь!
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #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 »
|
Записан
|
Странно всё это....
|
|
|
Джон
просто
Администратор
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)
|
|
« Ответ #13 : 30-04-2011 10:18 » |
|
Джон, этоне работает, если поверх нулей запушут данные (не безопасный strcpy например) имхо в большенстве случаем достаточно после копирования поставить 0 в последний байт буфера, да и гораздо быстрее можно еще поиспользовать strfcpy, но она есть не везде
|
|
|
Записан
|
Странно всё это....
|
|
|
Джон
просто
Администратор
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)
|
|
« Ответ #15 : 05-05-2011 18:20 » |
|
ну чего тут не понятного массив получатель char A[5] перед копирование заполняем нулями копируем "безопасной" функцией strncpy строку "bla-bla-bla" и указываем в качестве максимального колличества данный sizeof(A) получаем, что все наши нолики затёрты данными тоже самое в коде char a[5] = {0}; char b[] = "bla-bla-bla"; strcpy(a, b, sizeof(a)); и получается, что: - мы зря выполняли самую дорогую операцию, т.е. запись в память - это никак нас не защитило от затерания терминирующего нуля - если бы мы занули только первый байт у массива "a", то эффекты был бы тотже, но массив можно считать инициализированным
|
|
« Последнее редактирование: 05-05-2011 18:36 от Антон (LogRus) »
|
Записан
|
Странно всё это....
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #16 : 06-05-2011 05:47 » |
|
Используйте функцию strlcpy(), там где она есть (как вариант свою реализацию оной), в ней данные проблемы решены, ну или snprintf() на худой конец.
|
|
« Последнее редактирование: 06-05-2011 05:49 от darkelf »
|
Записан
|
|
|
|
|