Der Unterschied und das Prinzip von strcat und strncat

Wir alle wissen, dass strcat und strncat beide Funktionen sind, die Zeichen an eine Zeichenfolge anhängen. Was ist der Unterschied zwischen ihnen? Was sind ihre Prinzipien?

Zunächst müssen wir die Prinzipien der beiden verstehen, um zwischen ihnen unterscheiden zu können
: Wenn Sie die Funktion strcat-call strcat verwenden, zwei String-Arrays oder ein String-Array und einen String übergeben, müssen Sie den Header string.h aufrufen Datei ;

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

Der Quellcode lautet (ich habe ihn selbst implementiert, er unterscheidet sich vom tatsächlichen Quellcode, aber das Prinzip ist das gleiche).
Schritt 1: Zeigen Sie mit dem Zeiger der hinzugefügten Zeichenfolge auf die Zeichenfolge '\ 0'.
Schritt 2: Ändern Sie Exchange the hinzugefügte Zeichenfolge mit dem '\ 0' der hinzugefügten Zeichenfolge.
Schritt 3: Setzen Sie die letzte Position von str auf '\ 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;
}

Verwendung von strncat-Rufen Sie die Funktion strncat auf, übergeben Sie zwei Zeichenfolgen und einen ganzzahligen Wert. Der ganzzahlige Wert gibt die Anzahl der anzuhängenden Zeichen an. Sie müssen die Header-Datei string.h aufrufen.

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

Quellcode:
Schritt 1: Bewegen Sie den Zeiger von arr1 auf '\ 0'.
Schritt 2: Tauschen Sie das Element, auf das arr2 zeigt, gegen das Element aus, auf das arr1 zeigt.

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

Es ist deutlich zu sehen, dass die Parameter der beiden inkonsistent sind, der Effekt jedoch der gleiche ist. Der Hauptunterschied zwischen den beiden besteht darin, dass die Endbedingung der hinzugefügten Zeichenfolge von strcat () str2 == '\ 0' (str2) ist ist erforderlich Die hinzugefügte Zeichenfolge); Die Bedingung für das Ende der Schleife von strncat ist, dass die Anzahl der anzuhängenden Zeichenfolgen len 0 ist.

Warum sollte es also zwei Funktionen geben, die den gleichen Effekt erzielen?
Es scheint, dass der Implementierungseffekt der beiden gleich ist, aber wenn Sie die ursprüngliche Zeichenfolge zur ursprünglichen Zeichenfolge hinzufügen möchten, können Sie nur die Funktion strncat verwenden.

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

Da strcat im Wesentlichen die '\ 0' der hinzuzufügenden Zeichenfolge mit dem Element der hinzugefügten Zeichenfolge austauscht, wird '\ 0', wenn die Addition selbst erfolgt, mit dem vorherigen Element ausgetauscht, wenn alle Austausche später abgeschlossen sind wird feststellen, dass '\ 0' wieder nach hinten gegangen ist, so dass die Beendigungsbedingung nicht mehr hergestellt wird und Sie in eine Endlosschleife geraten; der Vorteil von strcat () besteht darin, dass dies erreicht werden kann, indem nur zwei übergeben werden Parameter, was relativ einfach ist;

Es wird jedoch empfohlen, strncat () zu verwenden, da die oben erwähnte Möglichkeit, in eine Endlosschleife zu fallen, nicht auftritt. Es wird höchstens eine weitere Schrittlänge (strlen (Arrayname)) gezählt und strncat () hat eine unverzichtbarer Vorteil: Freiheit Kontrollieren Sie die hinzuzufügenden Zeichen.

Ich denke du magst

Origin blog.51cto.com/15083094/2627811
Empfohlen
Rangfolge