Я что, идиот ???
void mystr2::copy(int from,int howmany,char* init,char* last){
int maxsize=-1;
if (last) maxsize=last-init;//на всякий случай проверка выхода за границы массива
int forcopy=((howmany>maxsize)&&(maxsize!=-1))?maxsize:howmany;
if (forcopy<=0) return;
int mylen=strlen(str);
if ((from>mylen)||(from<=0)) return ;
char * tmp=init;
for(int i=0;*(str+from+i-2)&&(i<forcopy);i++){
*(tmp+i)=*(str+from-1+i);
};
if (i==forcopy) *(tmp+i)=0;
}
а так нет
void mystr2::copy(int from,int howmany,char* init,char* last){
int maxsize=-1;
if (last) maxsize=last-init;//на всякий случай проверка выхода за границы массива
int forcopy=((howmany>maxsize)&&(maxsize!=-1))?maxsize:howmany;
if (forcopy<=0) return;
int mylen=strlen(str);
if ((from>mylen)||(from<=0)) return ;
char * tmp=init;
////
for(int i=0;*(tmp+i)=*(str+from-1+i)&&(i<forcopy);i++);
////Вместо подстроки возвращает "мусор"
if (i==forcopy) *(tmp+i)=0;
}
Проверял на BC++3.1 и MVC6
Почему так работает,
void mystr2::copy(int from,int howmany,char* init,char* last){
int maxsize=-1;
if (last) maxsize=last-init;//на всякий случай проверка выхода за границы массива
int forcopy=((howmany>maxsize)&&(maxsize!=-1))?maxsize:howmany;
if (forcopy<=0) return;
int mylen=strlen(str);
if ((from>mylen)||(from<=0)) return ;
char * tmp=init;
for(int i=0;*(str+from+i-2)&&(i<forcopy);i++){
*(tmp+i)=*(str+from-1+i);
};
if (i==forcopy) *(tmp+i)=0;
}
а так нет
void mystr2::copy(int from,int howmany,char* init,char* last){
int maxsize=-1;
if (last) maxsize=last-init;//на всякий случай проверка выхода за границы массива
int forcopy=((howmany>maxsize)&&(maxsize!=-1))?maxsize:howmany;
if (forcopy<=0) return;
int mylen=strlen(str);
if ((from>mylen)||(from<=0)) return ;
char * tmp=init;
////
for(int i=0;*(tmp+i)=*(str+from-1+i)&&(i<forcopy);i++);
////Вместо подстроки возвращает "мусор"
if (i==forcopy) *(tmp+i)=0;
}
Проверял на BC++3.1 и MVC6
Вверху ты в *(tmp+i) пишешь значение (str+from-1+i) а внизу - *(str+from-1+i)&&(i<forcopy) - я думаю, это совсем разные значения :)
попробуй нижний цикл переписать так:
for(int i=0,*(tmp+i)=*(str+from-1+i);*(tmp+i)&& i<forcopy);i++);
Вверху ты в *(tmp+i) пишешь значение (str+from-1+i) а внизу - *(str+from-1+i)&&(i<forcopy) - я думаю, это совсем разные значения :)
попробуй нижний цикл переписать так:
for(int i=0,*(tmp+i)=*(str+from-1+i);*(tmp+i)&& i<forcopy);i++);
Вообще-то "&&" - это логическая операция, а не битовая. Так что и там и там присваивается одно и то же.
Вообще-то "&&" - это логическая операция, а не битовая. Так что и там и там присваивается одно и то же.
да это логическая операция, и ее результат либо 0 либо 1 (логическая ложь или истина). Вот если бы ты внимательно посмотрел на результат работы этой процедуры, то заметил бы, что в tmp у тебя хранятся единицы... То есть во втором случае, у тебя в tmp пишется результат этой логической операции. То что я предложил (я не проверял когда писал, но сейчас уже проверил) синтаксически не правильная конструкция. Но идея в ней верна. Так что я думаю, ты догадаешься, как это переделать :0)