Добрый день.
Я нуждаюсь в помощи, потому что мне не удается найти объяснение вопросу.
В частности я стараюсь пытаться mi_strcpy
и mi_strcat
и использовав printf
он выходит (null)
Почему?
#include <stdio.h>
#define CERO 1
#define UNO 2
#define DOS 3
int mi_strlen(char *str){
int num_char;
while(*str!='\0'){
num_char++;
str++;
}
return num_char;
}
char* mi_strcpy(char *s1, char *s2){
while(*s2!='\0'){
*s1 = *s2;
s1++;
s2++;
}
*s1 = '\0';
return s1;
}
char* mi_strcat(char* s1, char* s2){
char concatena[mi_strlen(s1)+mi_strlen(s2)+1];
char *con_ptr;
con_ptr = concatena;
while(*s1!='\0'){
*con_ptr=*s1;
con_ptr++;
s1++;
}
while(*s2!='\0'){
*con_ptr=*s2;
con_ptr++;
s2++;
}
con_ptr++;
*con_ptr='\0';
s1=concatena;
return s1;
}
int main(void) {
char *str;
char str_uno[UNO] = "A";
char str_cero[CERO] = "";
char str_espacios[DOS] = " ";
char str_copiada[11];
str = str_uno;
int cuenta = mi_strlen(str);
printf("Cuenta %d y debería ser %d\n", cuenta, UNO-1);
str = str_cero;
cuenta = mi_strlen(str);
printf("Cuenta %d y debería ser %d\n", cuenta, CERO-1);
str = str_espacios;
cuenta = mi_strlen(str);
printf("Cuenta %d y debería ser %d\n", cuenta, DOS-1);
char *s1;
char *s2;
s1 = str_copiada;
s2 = str_uno;
printf("s1 es: \"%s\" y debería ser s2: %s\n",*mi_strcpy(s1,s2),s2);
char str_copiada2[11];
s1 = str_copiada2;
s2 = str_cero;
printf("s1 es: \"%s\" y debería ser s2: \"%s\"\n",*mi_strcpy(s1,s2),s2);
char str_copiada3[11];
s1 = str_copiada3;
s2 = str_espacios;
printf("s1 es: \"%s\" y debería ser s2: \"%s\"\n",*mi_strcpy(s1,s2),s2);
return 0;
}
на mi_strcpy
он мог бы менять *mi_strcpy(s1,s2),s2);
printf("s1 es: \"%s\" y debería ser s2: %s\n",*mi_strcpy(s1,s2),s2);
на
printf("s1 es: \"%s\" y debería ser s2: %s\n",mi_strcpy(s1,s2),s2);
Основываясь на Вашем коде Вы были бы должны хранить начальный адрес в s1
, так как Вы меняете ее, сделав s1++
и в return адрес не inical в измененный.
простой пример:
int a = 0;
a++;
a++;
a++;
Вїcuanto стоит в? итак, если бы он переместил ее, он стоил бы то, что увеличило не начальную стоимость, так как это более или менее то же самое, я надеюсь, что он понимает.
Так, что Вы должны не бороться с этим, может манипулировать этим например так, бросая немного сахара:
char* mi_strcpy(char* d, char* s) {
int c = 0;
while (s[c] != '\0') {
d[c] = s[c];
c++;
}
d[c] = '\0';
return d;
}
Сначала в mi_strlen
ему остается инициализировать num_char
, поэтому дай любую стоимость и вызови неудачи в mi_strcat
...
int mi_strlen(char *str){
int num_char = 0; /* falta =0 */
while(*str!='\0'){
num_char++;
str++;
}
return num_char;
}
Потом в mi_strcopy
, ты возвращен s1
со всеми ++
накопленные, костлявая, что указывает на последнее положение string. То, что ты можешь делать, состоит в том, чтобы сохранять в промежуточной переменной первоначальную стоимость и это возвращать в конце концов... что-либо подобное:
char* mi_strcpy(char *s1, char *s2){
char *origAddr = s1; /* almacenas donde empieza la cadena */
while(*s2!='\0'){
*s1 = *s2;
s1++; /* se acumula el ++ y se pierde el inicio */
s2++;
}
*s1 = '\0';
return origAddr; /* retornas donde empieza la cadena, s1 apunta al \0 */
}
То же самое происходит в mi_strcat
. но, тебя оставило это изменение тебе, так как уже ты знаешь, который является проблемой с формой, в которой ты увеличиваешь указатели.
В конце концов, когда ты делаешь:
printf("s1 es: \"%s\" y debería ser s2: %s\n",*mi_strcpy(s1,s2),s2);
*
перед mi_strcpy
эта остальные, так как mi_strcpy
возвратись char*
.