Разница и принцип работы strcat и strncat

Все мы знаем, что strcat и strncat - это функции, которые добавляют символы в строку. В чем разница между ними? Каковы их принципы?

Прежде всего, мы должны понять принципы этих двух, чтобы иметь возможность различать их;
использование функции strcat-call strcat, передача двух строковых массивов или строкового массива и строки, вам нужно вызвать заголовок string.h файл ;

    char arr1[30] = "abcd";
    char arr2[] = "efd";
    strcat(arr1, arr2);
    ----------------------
     strcat (str,"concatenated.")

Исходный код (я реализовал его сам, он будет отличаться от реального исходного кода, но принцип тот же)
Шаг 1: Наведите указатель добавленной строки на строку '\ 0'
Шаг 2: Измените Обменять добавленная символьная строка с '\ 0' добавленной символьной строки.
Шаг 3: Установите последнюю позицию str на '\ 0'

void strcat(char* str, const char* d)
{
    while (*str)
        str++;
    while (*d != '\0')
    {
        *str = *d;
        str++;
        d++;
    }
    str++;
    *str = '\0';
}
int main()
{
    char arr1[30] = "abcd";
    char arr2[] = "efd";
    strcat(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

Использование strncat - вызов функции strncat, передача двух строк и целочисленного значения, целочисленное значение представляет количество добавляемых символов, вам необходимо вызвать файл заголовка string.h;

  char str1[20] = "abcde";
  char str2[20] = "cdefad";
  strncat (str1, str2, 6);

Исходный код:
Шаг 1: Переместите указатель arr1 на "\ 0"
Шаг 2: Замените элемент, на который указывает arr2, на элемент, на который указывает arr1;

void my_strncat(char* arr1, char* arr2, int len)
{
    assert(arr1);
    assert(arr2);
    arr1 = arr1 + len;
    while (len-- != 0)
    {
        //第一步:先把arr1的指针移到'\0'处
        //第二步:把arr2所指向的元素与arr1所指向的元素交换;
        *arr1 = *arr2;
        arr1++;
        arr2++;
    }
}
int main()
{
    char arr1[30] = "abcdeef";
    int len = strlen(arr1);
    my_strncat(arr1, arr1, len);
    printf("%s\n", arr1);
    return 0;
}

Хорошо видно, что параметры этих двух параметров несовместимы, но эффект тот же. Основное различие между ними заключается в том, что конечным условием для добавленной строки strcat () является str2 == '\ 0' (str2 требуется Добавляемая строка); условием завершения цикла strncat является то, что количество добавляемых строк len равно 0;

Так почему две функции должны обеспечивать одинаковый эффект?
Кажется, что эффект реализации у них одинаковый, но если вы хотите добавить исходную строку к исходной строке, вы можете использовать только функцию strncat;

    char arr1[30] = "abcd";
    strcat(arr1, arr1);

Поскольку strcat по существу обменивает '\ 0' добавляемой строки с элементом добавленной строки, тогда, когда добавление является само по себе, '\ 0' будет заменен предыдущим элементом, когда все обмены будут завершены Позже, вы обнаружит, что '\ 0' снова вернулся назад, так что условие завершения больше не будет устанавливаться, и вы попадете в бесконечный цикл; удобство strcat () заключается в том, что его можно достичь, передав только два параметры, что относительно просто;

Однако рекомендуется использовать strncat (), потому что вышеупомянутая возможность попадания в бесконечный цикл не возникнет. Учитывается не более одного дополнительного шага (strlen (имя массива)), а strncat () имеет непременное преимущество - свобода. Управляйте персонажами, которые нужно добавить;

рекомендация

отblog.51cto.com/15083094/2627811