web-dev-qa-db-ger.com

So kopieren Sie eine Zeichenfolge mit einem Zeiger

Hier ist ein Programm, das ich geschrieben habe, um eine String-Konstante zu kopieren.

Wenn das Programm ausgeführt wird, stürzt es ab. Warum passiert dies ?

#include <stdio.h>

char *alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char c;
char *l;

main(){
   while((c = *alpha++)!='\0')
       *l++ = *alpha;
   printf("%s\n",l);
}
14
Arabeka

Um eine solche manuelle Kopie durchzuführen :

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char* orig_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char* ptr = orig_str;

    // Memory layout for orig_str:
    // ------------------------------------------------------------------------
    // |0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|  --> indices
    // ------------------------------------------------------------------------
    // |A|B|C|D|E|F|G|H|I|J|K |L |M |N |O |P |Q |R |S |T |U |V |W |X |Y |Z |\0|  --> data
    // ------------------------------------------------------------------------

    int orig_str_size = 0;
    char* bkup_copy = NULL;

    // Count the number of characters in the original string
    while (*ptr++ != '\0')
        orig_str_size++;        

    printf("Size of the original string: %d\n", orig_str_size);

    /* Dynamically allocate space for the backup copy */ 

    // Why orig_str_size plus 1? We add +1 to account for the mandatory 
    // '\0' at the end of the string.
    bkup_copy = (char*) malloc((orig_str_size+1) * sizeof(char));

    // Place the '\0' character at the end of the backup string.
    bkup_copy[orig_str_size] = '\0'; 

    // Current memory layout for bkup_copy:
    // ------------------------------------------------------------------------
    // |0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|  --> indices
    // ------------------------------------------------------------------------
    // | | | | | | | | | | |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |\0|  --> data
    // ------------------------------------------------------------------------

    /* Finally, copy the characters from one string to the other */ 

    // Remember to reset the helper pointer so it points to the beginning 
    // of the original string!
    ptr = &orig_str[0]; 
    int idx = 0;
    while (*ptr != '\0')
        bkup_copy[idx++] = *ptr++;

    printf("Original String: %s\n", orig_str);   
    printf("Backup String: %s\n", bkup_copy);

    return 0;
}
16
karlphillip

Um Strings in C zu kopieren, können Sie strcpy verwenden. Hier ist ein Beispiel:

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

const char * my_str = "Content";
char * my_copy;
my_copy = malloc(sizeof(char) * (strlen(my_str) + 1));
strcpy(my_copy,my_str);

Wenn Sie versehentliche Pufferüberläufe vermeiden möchten, verwenden Sie strncpy anstelle von strcpy. Zum Beispiel:

const char * my_str = "Content";
const size_t len_my_str = strlen(my_str) + 1;
char * my_copy = malloc(len_my_str);
strncpy(my_copy, my_str, len_my_str);
15
Vitor Villar

Sie müssen Speicherplatz für l zuweisen. Derzeit zeigt es auf eine zufällige Stelle im Speicher, und wenn Sie versuchen, an diese Stelle zu schreiben, wird das Betriebssystem Ihre Anwendung wahrscheinlich herunterfahren (AKA-Absturz). Wenn Sie möchten, dass Ihr Code unverändert bleibt, weisen Sie l mit malloc() etwas Platz zu, oder erstellen Sie l als Zeichenarray mit ausreichend Platz für "ABCDEFGHIJKLMNOPQRSTUVWXYZ" plus NULL-Abschlusszeichen.

Siehe http://cslibrary.stanford.edu/106/ für eine Einführung zu Zeigern.

3
lreeder

Kopieren Sie eine Zeichenfolge "Konstante/Literal/Zeiger"

char *str = "some string thats not malloc'd";
char *tmp = NULL; 
int i = 0; 
for (i = 0; i < 6; i++) {
    tmp = &str[i];
}
printf("%s\n", tmp);

Rückgängig gemacht

char *str = "some stupid string"; 
char *tmp, *ptr = NULL; 
ptr = str;
while (*str) { ++str; } 
int len = str - ptr;
int i = 0;
for (i = len; i > 11; i--) {
    tmp = &ptr[i];
} 
printf("%s\n", tmp); 

tmp = &blah[i] kann mit tmp = &(*(blah + i)) ausgetauscht werden.

0
user5062183

Sie können den folgenden Code direkt ausführen:

char *alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *l = alpha;

Wenn Ihr Code unten war:

const char *alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char *l = alpha;

:)

0

die cpy-Funktion benötigt zwei Zeichenzeiger, und der src-Zeiger zeigt auf das in der Hauptfunktion definierte Anfangszeichen von src (char-Array), und der Zeiger des Desktors verweist auf die anfängliche Position von des (char-Feld), das im definiert ist main-Funktion und der while-Schleifenwert des src-Zeigers weisen den Wert dem Zeiger zu und erhöhen den Zeiger auf das nächste Element. Dies geschieht, bis die Schleife auf null trifft und aus der Schleife austritt und der Zeiger einfach den Wert null hat alle Werte übernehmen. 

#include<stdio.h>
void cpy(char *src,char *des)
{
     while(*(des++) = *(src++));
     *des = '\0';
}

int main()
{
     char src[100];
     char des[100];
     gets(src);
     cpy(src,des);
     printf("%s",des);
}

Ausgabe: Bild

0
Shadab Eqbal
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 256
int main(void) {
    char *original, *copy, *start; //three character pointers
    original = malloc(sizeof(char) * MAX_LENGTH); //assigning memory for strings is good practice
    gets(original); //get original string from input
    copy = malloc(sizeof(char) * (strlen(original)+1)); //+1 for \0

    start = copy;
    while((*original)!='\0')
       *copy++ = *original++;
    *copy = '\0';
    copy = start;

    printf("The copy of input string is \"%s\".",copy);
    return 0;
}
0
Shail