Почему использовав printf (“%s”, char * []) он печатается (null)?

Добрый день.

Я нуждаюсь в помощи, потому что мне не удается найти объяснение вопросу.

В частности я стараюсь пытаться 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;
}
0
задан 04.03.2016, 21:27
2 ответа

на 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;
}

https://ideone.com/02YmKw

1
ответ дан 24.11.2019, 14:46
  • 1
    у тебя есть raz и # 243; n ангел, когда он это составит, снял этих *, что не идут там. потом я это забыл, когда postie:) – rnrneverdies 05.03.2016, 15:06

Сначала в 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*.

0
ответ дан 24.11.2019, 14:46