2013-09-21 2 views
14

Вот программа, которую я написал для копирования константы строки.Как скопировать строку с помощью указателя

Когда программа запускается, она падает. Почему это происходит ?

#include <stdio.h> 

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

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

Вам нужно * выделить пространство * для "л". Например: 'char * l = malloc (strlen (alpha) +1);'. PS: Определенно ознакомьтесь с отладчиком. Он покажет вам, где именно он падает ... что важно для понимания причины и устранения проблемы. IMHO ... – paulsm4

ответ

13

Чтобы скопировать строки в C, вы можете использовать strcpy. Вот пример:

#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); 

Если вы хотите, чтобы избежать случайного переполнения буфера, используйте strncpy вместо strcpy. Например:

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); 
+9

«sizeof (char)» не нужно - большинство из них утверждало бы, что вы должны его оставить. IMHO ... Также стоит отметить, что C имеет [strdup()] (http://linux.die.net/man/3/strdup), который объединяет malloc() и strcpy() вместе. Но наиболее важным моментом является выделение пространства для «*». – paulsm4

+0

Вы правы, я забыл strdup(). –

+0

Я знаю, что происходит в моей программе. Благодаря! – Arabeka

3

Необходимо выделить место для l. В настоящее время он указывает на случайное пятно в памяти, и если вы попытаетесь записать это место, операционная система, скорее всего, отключит ваше приложение (AKA crash). Если вы хотите, чтобы ваш код работал как есть, затем назначьте некоторое пространство для l с помощью malloc() или создайте l как массив символов с достаточным пространством для хранения "ABCDEFGHIJKLMNOPQRSTUVWXYZ" плюс NULL-терминатор.

См. http://cslibrary.stanford.edu/106/ для праймера на указателях.

16

Чтобы выполнить такую ​​вручную копии:

#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; 
} 
+0

Возможно, вы написали 'bkup_copy = (char *) malloc ((orig_str_size + 1) * sizeof (char));' (обратите внимание на скобки вокруг 'orig_str_size + 1')? –

+0

Я думаю, что, поскольку мы говорим о указателях, этот код может иметь больше смысла: 'ptr = orig_str' (логически это то же самое из' ptr = & orig_str [0] '), но немного более элегантно. Это только мое мнение. – b3h3m0th

0

Скопируйте строку "постоянный/буквальный/указатель"

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

Обращенного

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] можно поменять местами с tmp = &(*(blah + i)).

0
#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

Вы можете непосредственно сделать следующий код:

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

Если код был ниже:

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

:)

0

функция КПЮ будет принимать два полукокса указателями, и Указатель src указывает на начальный символ src (char array), определенный в основной функции, и тот же, что и указатель des указывает на начальное местоположение des (char array), определенное в основной функции, и значение цикла while указателя src присваивают значение дескриптору и увеличивают указатель на следующий элемент, это произойдет до тех пор, пока цикл не встретится с нулем и не появится из цикла и дескриптора будет просто присваиваться значение null после принятия всех значений.

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

Выход: Image

+0

Пожалуйста, добавьте некоторое объяснение того, как это решает поставленную проблему. Просто код публикации означает, что ваш ответ имеет низкое качество и ценность. –

Смежные вопросы