2016-12-12 3 views
1

Ich versuche, Zeichen mit anderen Manipulationen von einem Zeiger zum anderen zu kopieren. Ich habe versucht, strcat(), strncat(), strcpy(), strncpy() zu verwenden, aber immer Fehler zu bekommen. Wie kann ich ein Zeichen vom Quellzeiger zum Zielzeiger kopieren?
Ich übersetzte ursprünglich einfache Anführungszeichen als arg 2 von strcat und es hat nicht funktioniert. Als ich es in doppelte Anführungszeichen änderte, funktionierte es. Hat es etwas mit "String-Konstanten" oder "Charakter-Konstanten" oder etwas ganz anderem zu tun?C Zeichen-für-Zeichen-Zeichenfolgenmanipulation von const char * src zu char * dest

void korsoroi(char *dest, const char *src) { 
    int wcount = 0; 
    int i = 0; 
    while (src[i] != '\0') { 

     if (src[i] == 'k' && src[i + 1] == 's') { 
      strcat(dest, "x"); 
      i++; 
     } 
     else if (src[i] == 't' && src[i + 1] == 's') { 
      strcat(dest, "z"); 
      i++; 
     } 
     else if (src[i] == ' ') { 
      wcount++; 
      if (wcount % 3 == 0) { 
       strcat(dest, " niinku"); 
      } 
      if (wcount % 4 == 0) { 
       strcat(dest, " totanoin"); 
      } 
     } 
     else { 
     //expected 'const char *' but argument is of type 'char' 
//   strcat(dest, src[i]); 
//   strcat(dest, *(src + i); 

     //warning: cast to pointer from integer of different size 
//   strcat(dest, (char*)src[i]); 

     //returns strange characters but compiles 
     //dest[strlen(dest)] = src[i]; 


     } 
     i++; 
    } 
} 

http://2016-aalto-c.tmchq.co/en/Module_2/ Aufgabe 08

+0

ist 'dest' beschreibbar und genügend Speicher hat? –

+0

Sie können davon ausgehen, dass an der Adresse dest genügend Speicherplatz vorhanden ist, um die resultierende Zeichenfolge zu speichern. –

Antwort

1

Was Sie brauchen, ist ein Zeiger, der das Ende von dest verfolgt. Wenn Sie am Ende von dest weitere Dinge hinzufügen, erhöhen Sie diesen anderen Zeiger entsprechend. Beispiel:

void korsoroi(char *dest, const char *src) 
{ 
    char* dest_ptr = &dest[strlen(dest)]; // point at end of string 

    for(; *src != '\0; src++) 
    { 
    if(src[i] == whatever) 
    { 
     strcpy(dest_ptr, "something"); 
     dest_ptr += sizeof("something"); 
    } 
    else 
    { 
     *dest_ptr = *src; 
     dest_ptr++; 
    } 
    } 

    *dest_ptr = '\0'; 
} 

Auch wenn Sie src[i+1] dann müssen Sie zunächst prüfen, ob src[i+1] nicht '\0' verwenden werden.

0

In strcat(dest, src[i]);, ist das zweite Argument ein char kein char *.

Sie müssen stattdessen src+i verwenden, um eine char * zu haben. Dies wird die gesamte verbleibende Zeichenfolge kopieren, nicht sicher, ob Sie das wollen, aber ansonsten müssen Sie einen Dummy char * mit nur einem char darin erstellen oder einen anderen Ansatz verwenden.

+0

Wie würden Sie dieses Problem angehen? –

+0

Ein besserer Weg (anstelle von 'strcat'),' dest' zu erstellen, besteht darin, einen Index (zB 'z') zu haben und Zeichen mit' dest [z ++] = src [i] 'zu verketten. Die Funktion 'strcat' ist ineffizient und nicht zum Anhängen einzelner Zeichen geeignet. – Aganju

0

Der beste Ansatz ist hier direkt von src zu dest

kopieren Wenn Sie das xth Byte in Quelle, auf die yth Lage in dest kopieren möchten, dann können Sie verwenden.

dest[y] = src[x] 

Dann können Sie es um eine Schleife wickeln, um so viele Bytes wie Sie wollen zu kopieren.

Vergessen Sie nicht, am Ende dest eine \0 hinzuzufügen.

0

Hier ist meine Lösung

void korsoroi(char *dest, const char *src) { 
     int count = 0; 
     while (*src) { 
      if (*src == 'k' && *(src + 1) == 's') { 
       *dest++ = 'x'; 
       src++; 
      } else if (*src == 't' && *(src + 1) == 's') { 
       *dest++ = 'z'; 
       src++; 
      } else if (*src == ' ') { 
       *dest++ = ' '; 
       count++; 
       if (!(count % 3)) { 
        strcpy(dest, "niinku"); 
        dest += strlen("niinku"); 
        if(*(src + 1)){ 
         *dest++ = ' '; 
        } 
       } else if (!(count % 4)) { 
        strcpy(dest, "totanoin"); 
        dest += strlen("totanoin"); 
        if(*(src + 1)){ 
         *dest++ = ' '; 
        }     
       } 
      } else { 
       *dest++ = *src; 
      } 
      src++; 
     } 
     *dest = '\0'; 
    } 
Verwandte Themen