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

Compilation warnings:

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 is a pointer and hello too, what's going on?

anatolyg
  • 26,506
  • 9
  • 60
  • 134
jhonnna
  • 107
  • 5

3 Answers3

6

You are doing it wrong:

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

Explanation: strcpy operates on pointers, where both are start location to write to and read from, so you have to pass those, not characters. Your read location is hello, your write location is str. Then strcpy loops until it finds a 0 character (which is included) to stop copying, so your loop is unnecessary. Last thing is that you have to free allocated memory. Also sizeof(char) doesn't make sense: it's always 1.

anatolyg
  • 26,506
  • 9
  • 60
  • 134
Mateusz Wojtczak
  • 1,621
  • 1
  • 12
  • 28
2

The issue here is your attempting to use C-strings as arrays of characters, which is certainly allowed but it's a different behavior than using them as pointers to null-terminated strings. Doing hello[0] evaluates to the first character of the string, which is simply a usually 8-bit integer. A char is a value, it does not correspond to a memory address. The correct statement you want is

strcpy(str, hello);

For reference, if you want to get a string starting at some point in your string, you would do

strcpy(str, hello + 1);

Performing addition on a pointer evaluates to a pointer that is some n addresses forward in memory.

Josh Weinstein
  • 2,788
  • 2
  • 21
  • 38
  • You might want to delete references to pointer arithmetic - it's probably off-topic in this answer, and may be generally confusing. – anatolyg May 14 '18 at 21:50
  • deleted it, but i thought the asker was attempting to get the ith point where a string starts by mistakenly doing str[i] in a function that accepts a pointer. – Josh Weinstein May 14 '18 at 21:53
  • `hello[0]` evaluates a `char` which is usually 8-bit (but may not be) and can be signed or unsigned. Only some `char`s are printable characters (specifically the non-negative ones for which `isprint(c)` returns non-zero). I think your answer is in spirit correct, but these small technical errors subtract from its quality. – Paul Hankin May 14 '18 at 22:07
  • @PaulHankin good point, I fixed it just to clarify that a char is a value and not an address of memory or a pointer. – Josh Weinstein May 14 '18 at 22:27
0

The definition of strcpy takes two char pointers not the str[], hello[] arrays.

char *strcpy(char *destination, const char *source)
chux - Reinstate Monica
  • 143,097
  • 13
  • 135
  • 256
Nikhil S
  • 3,786
  • 4
  • 18
  • 32