2017-10-25 4 views
1

Ich versuche, diese Ausgabe zu haben:C Programmkopie String ohne strcpy() zu verwenden mit genügend Speicher

Comparing results of concat and strcat ... 
strcmp("Plain old stringTroy", "Plain old stringTroy") says: 0 

Die strcmp 0 zurück, wenn die beiden String-Argumente identisch sind. Wenn das Ergebnis 0 ist, verhält sich die Concat genau wie die Bibliotheksfunktion strcat.

das ist, was ich für concat Methode habe.

#define MAXSIZE 32  
void concat(char dest[], char src[])           
{                   
    int i=length(src);               
    int j=0;                  
    for(j; j<src[j] !='\0'; j++) {                   
     dest[i+j] = src[j];              
    }                   
    dest[i+j] = '\0';               
} 

Länge Methode ist:

int length(char str[])              
{                   
     // Add code here to return the length of the        
     // string str without using the strlen function       
     // Do not count the null character '\0'         
     // in computing the length of the string         
     int len=0;                 
     int i;                  
     for(i=0;i<str[i];i++) {              
      len++;                 
     }                   
     return len;                
} 

Das ist mein Haupt

int main()                 
{                   
     // Variable declarations for all parts   
     char str2[] = "Troy";                         
     char str4[] = "Plain old string";           
     char str6[MAXSIZE]; 
    // Part 6                 
     printf("\n----- Part 6 -----\n");           
     // Make a copy of the destination string first, to be reused later   
     strcpy(str6, str4);              
     concat(str4, str2);              
     strcat(str6, str2);              
     printf("Comparing results of concat and strcat ...\n");     
     printf("strcmp(\"%s\", \"%s\") says: %d\n", 
      str4, str6, strcmp(str4, str6) 
      ); 

     return 0;                 
} 

Das ist mein Ausgang ist, wenn ich es laufen:

----- Part 6 ----- 
Comparing results of concat and strcat ... 
strcmp("PlaiTroy", "Plain old stringTroy") says: -1 

Der erste String ist nicht das gleiche wie die zweite Saite, weshalb ich es bekomme Ting eine -1. Mein Problem ist in meiner Concat-Methode, aber ich kann nicht verstehen, warum es nicht gut ausgeführt wird. Liegt es an den Räumen? Wird 0 und '\ 0' nicht gut ausgeführt?

+5

'j

+3

auch in deiner Methode' i

+0

Haben Sie versucht, die Zeichenfolgen zu drucken, um zu sehen, wie sie aussehen? – klutt

Antwort

2

Es gibt mehrere Probleme im Code:

  • Der Loop-Test in der length Funktion ist falsch: statt i < str[i], sollte es sein:

    for (i = 0; str[i] != '\0'; i++) 
    
  • das gleiche Problem in der concat Funktion. Ändern Sie die Schleife:

    for (j = 0; src[j] != '\0'; j++) { 
    
  • auch in der concat Funktion sollte i sein die Länge dst, das nicht von src. Sie könnten len anstelle von i für diese Variable verwenden.

  • Das Array str4 in der Funktion main hat am Ende keinen Platz für concat, um irgendetwas anzuhängen. Definieren Sie es mit einer größeren Größe auf diese Weise:

    char str4[MAXSIZE] = "Plain old string";  
    

Hier ist die korrigierte Version:

#include <stdio.h> 
#include <string.h> 

#define MAXSIZE 32 

void concat(char dest[], char src[]) { 
    int len = length(dest); 
    int j; 
    for (j = 0; src[j] != '\0'; j++) { 
     dest[len + j] = src[j]; 
    } 
    dest[len + j] = '\0'; 
} 

int length(char str[]) { 
    int len = 0; 
    int i; 
    for (i = 0; i < str[i]; i++) { 
     len++; 
    } 
    return len; 
} 

int main(void) { 
    // Variable declarations for all parts 
    char str2[MAXSIZE] = "Troy"; 
    char str4[MAXSIZE] = "Plain old string"; 
    char str6[MAXSIZE]; 
    // Part 6 
    printf("\n----- Part 6 -----\n"); 
    // Make a copy of the destination string first, to be reused later 
    strcpy(str6, str4); 
    concat(str4, str2); 
    strcat(str6, str2); 
    printf("Comparing results of concat and strcat ...\n"); 
    printf("strcmp(\"%s\", \"%s\") says: %d\n", 
      str4, str6, strcmp(str4, str6)); 
    return 0; 
} 
1

Sie haben mehrere Probleme in beiden Funktionen:

concat

for(j; j<src[j] !='\0'; j++) { 

Was die Bedingung hier für die Ausreise ist ?, src[j] != '\0' genug ist.

dest[i+j] = src[j];              

Hier fügen Sie Daten mit einem von i versetzt, aber ich ist die Länge der src, nicht dst.

So könnte die korrigierte Funktion sein:

void concat(char dest[], char src[]) 
{ 
    /* descriptive variable name */ 
    int len_dst = length(dst); 
    int j=0; 

    /* clear exit condition */ 
    for(; src[j] != '\0'; j++) { 
     dest[len_dst+j] = src[j]; 
    } 
    dest[len_dst+j] = '\0'; 
} 

length

for(i=0;i<str[i];i++) { 

Gleiche Bemerkung, was ist die Ausgangsbedingung? src[i] != '\0' genug ist

So könnte die korrigierte Funktion sein:

int length(char str[]) 
{ 
     int len=0; 
     int i; 
     /* clear exit condition */ 
     for (i=0; str[i] != '\0'; i++) { 
      len++; 
     } 
     return len; 
} 

main

Und Warnung in main Funktion:

char str4[] = "Plain old string"; 
concat(str4, str2); /* <- erases what is after str4 */ 

Sie haben nicht genug Platz zum Speichern Ergebnis haben .Schreiben Sie so etwas wie:

char str2[] = "Troy"; 
char str4[MAXSIZE] = "Plain old string"; /* <-- reserve spaces after str4*/ 
/* ... */ 
concat(str4, str2);