Почему я не могу сделать strcpy? - PullRequest
0 голосов
/ 15 мая 2018
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main() {
   const char* hello = "Hello, World!";
   char *str = malloc(14 * sizeof(char));

   for (int i = 0; i < 14; i++) {
      strcpy(str[i],hello[i]);
   }
   str[14]='\0';

   printf("%s\n", str);

   return 0;
}

предупреждения компиляции:

warning: passing argument 1 of 'strcpy' makes pointer from integer without a cast [-Wint-conversion]   
note: expected 'char *' but argument is of type 'char'   
warning: passing argument 2 of 'strcpy' makes pointer from integer without a cast [-Wint-conversion]

str это указатель и тоже привет, что происходит?

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Проблема здесь в том, что вы пытаетесь использовать C-строки в качестве массивов символов, что, безусловно, разрешено, но это другое поведение, чем использование их в качестве указателей на строк с нулевым символом в конце строк , Выполнение hello[0] оценивает первый символ строки, который обычно является 8-битным целым числом. char - это значение, оно не соответствует адресу памяти. Правильное утверждение, которое вы хотите, это

strcpy(str, hello);

Для справки: если вы хотите получить строку, начинающуюся в некоторой точке вашей строки, вы должны сделать

strcpy(str, hello + 1);

При выполнении сложения с указателем вычисляется указатель, который на несколько адресов пересылается в память.

0 голосов
/ 15 мая 2018

Вы делаете это неправильно:

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

int main() {
   const char* hello = "Hello, World!";
   char *str = malloc(strlen(hello)+1);

   strcpy(str,hello);
   printf("%s\n", str);
   free(str);
   return 0;
}

Объяснение: strcpy работает с указателями, где оба являются начальным местоположением для записи и чтения, поэтому вы должны передавать их, а не символы.Ваше местоположение чтения hello, ваше местоположение записи str.Затем strcpy зацикливается, пока не найдет символ 0 (который включен), чтобы остановить копирование, поэтому ваш цикл не нужен.Последнее, что вы должны освободить выделенную память.Также sizeof(char) не имеет смысла: это всегда 1.

0 голосов
/ 15 мая 2018

Определение strcpy требует двух char указателей, а не массивов str[], hello[].

char *strcpy(char *destination, const char *source)
...