Как исправить strcpy так, чтобы она обнаружила перекрывающиеся струны

В интервью мне попросили написать реализацию strcpy , а затем исправить его, чтобы он правильно обрабатывает перекрывающиеся строки. Моя реализация ниже, и она очень наивная. Как я это исправить так, чтобы:

  1. он обнаруживает перекрывающиеся стринги и
  2. после обнаружения, как мы имеем дело с перекрытием и продолжить?

char* my_strcpy(char *a, char *b) {

     if (a == NULL || b == NULL) {
         return NULL;
     }
     if (a > b) {
         //we have an overlap?
         return NULL;
     }
     char *n = a;

     while (*b != '\0') {
         *a = *b;
         a++;
         b++;
     }
     *a = '\0';
     return n;
}

int main(int argc, char *argv[])
{
    char str1[] = "wazzupdude";
    char *after_cpy = my_strcpy(str1 + 2, str1);
    return 0;
}

Редактировать:

Итак, одна возможная реализация на основе @ Безопасный Ответ:

char* my_strcpy(char *a, char *b) {

    if (a == NULL || b == NULL) {
        return NULL;
    }

    memmove(a, b, strlen(b) + 1);
    return a;
}

Если мы не полагаемся на MemMove , то

char* my_strcpy(char *a, char *b) {

    if (a == NULL || b == NULL) {
        return NULL;
    }

    if (a == b) {
        return a;
    }

    // case1: b is placed further in the memory
    if ( a <= b && a + strlen(a) > b ) {
        char *n = a;

        while(*b != '\0') {
            *a = *b;
            a++; b++;
        }
        *a = '\0';
        return n;
    }

    // case 2: a is further in memory
    else if ( b <= a && b + strlen(b) > a ) { 
        char *src = b + strlen(b) - 1; // src points to end of b
        char *dest = a;

        while(src != b) {
            *dest = *src;
            dest--; src--;  // not sure about this..
        }
        *a = '\0';
        return a;
    }
}

10
задан Student 22 January 2019 в 23:21
поделиться