Warum kann ich nicht kopieren eines Arrays mittels `=`?

Ich bin angefangen C zu lernen durch Lesen K&R und gehen durch einige der übungen. Nach einigen kämpfen war ich endlich in der Lage, komplette übung 1-19 mit dem folgenden code:

/* reverse: reverse the character string s */
void reverse(char s[], int slen)
{
  char tmp[slen];
  int i, j;

  i = 0;
  j = slen - 2;    /* skip '\0' and \n */

  tmp[i] = s[j];
  while (i <= slen) {
    ++i;
    --j;
    tmp[i] = s[j];
  }

  /* code from copy function p 29 */
  i = 0;
  while ((s[i] = tmp[i]) != '\0')
    ++i;

}

Meine Frage ist in Bezug auf das Letzte bit des Codes, wo die tmp char-array kopiert s. Warum nicht eine einfache s = tmp; Arbeit statt? Warum muss man haben, um das array Durchlaufen kopieren von index zu index?

  • K&R nicht benutzen ist die Lösung - Sie schrieb für C89, nicht in C99, aber in Ihrer Lösung verwendet ein VLA (variable length array), die wurde nur Hinzugefügt, in C99. Darüber hinaus gibt es keine Garantie, dass es einen Zeilenumbruch in den string - AFAIK. Und konventionell, die Länge eines Strings schon schließt das terminal null. Das bedeutet, dass Ihre '-2', ist wahrscheinlich falsch. Die Bedingung in der ersten while-Schleife verwenden soll, '<' anstelle von '<='; es ist keine Tugend der Austausch der Hauptfigur mit sich selbst. Die Schnellste Lösung vertauscht die array in situ mit keine temporären array.
  • Vielen Dank für die Einsicht. Du hast Recht, ich dachte über die -2 diesem morgen, da war ein hack, ich habe Letzte Nacht um 3 Uhr, nur um es zu arbeiten. Ich wahrscheinlich sollte setzen Sie einfach ein if (s[i] != '\n' || s[i] != '\0') in die in der ersten while-Schleife.
  • Alte Kommentar, aber (s[i] != '\n' || s[i] != '\0') ist immer true.
  • Es gibt keine logische Antwort - es ist absolut möglich, eine solche Funktion in der Sprache - eigentlich bin ich derzeit ein modifizierter gcc-compiler akzeptiert arrays und Struktur Aufgaben auch mit inkompatiblen Typen (weil, die Zeit haben zu schreiben, dumm-casts).
  • Sie können sogar so etwas wie char arr[20] = *p; seit *p ist ein lvalue. Die änderung hat mich wie 5 Minuten zu machen - ich habe nur Hinzugefügt, ein einzelnes if.
InformationsquelleAutor felideon | 2009-06-20
Schreibe einen Kommentar