Как скопировать строку с помощью указателя
Здесь программа, которую я написал для копирования строковой константы.
Когда программа запускается, она сбой. Почему это происходит?
#include <stdio.h>
char *alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char c;
char *l;
main(){
while((c = *alpha++)!='\0')
*l++ = *alpha;
printf("%s\n",l);
}
Ответы
Ответ 1
Для выполнения такой ручной копии:
#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;
}
Ответ 2
Чтобы скопировать строки в C, вам нужно использовать strcpy. Следуйте примеру:
#include <stdio.h>
#include <string.h>
const char * my_str = "Content";
char * my_copy;
my_copy = malloc(sizeof(char) * strlen(my_str));
strcpy(my_copy,my_str);
strcpy - лучший способ скопировать строки.
Ответ 3
Вам нужно выделить место для l
. В настоящее время он указывает на случайное пятно в памяти, и если вы попытаетесь записать это место, операционная система, скорее всего, отключит ваше приложение (AKA crash). Если вы хотите, чтобы ваш код работал как есть, затем назначьте некоторое пространство для l
с помощью malloc()
или создайте l
в качестве массива символов с достаточным пространством для хранения "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
плюс NULL-терминатор.
См. http://cslibrary.stanford.edu/106/ для праймера на указателях.
Ответ 4
Скопировать строку "constant/literal/pointer"
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))
.
Ответ 5
#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;
}
Ответ 6
Вы можете напрямую выполнить приведенный ниже код:
char *alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *l = alpha;
Если ваш код был ниже:
const char *alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char *l = alpha;
:)
Ответ 7
Функция cpy примет два указателя char, а указатель src укажет на начальный символ массива src (char), определенный в основной функции, и тот же, что и указатель des, укажет на начальное местоположение des (массив char), определенный в основной функции, и значение цикла while указателя src присваивает значение указателю des и увеличивает указатель на следующий элемент, это произойдет до тех пор, пока цикл не будет встречен с нулем и не выйдет из loop и des pointer просто присваивают значение 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);
}
Выход: Изображение