jhonnna
jhonnna

Reputation: 107

Why can't I do strcpy?

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

Upvotes: 5

Views: 1916

Answers (3)

Josh Weinstein
Josh Weinstein

Reputation: 2968

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.

Upvotes: 2

Nikhil
Nikhil

Reputation: 3950

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

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

Upvotes: 0

Temple
Temple

Reputation: 1631

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.

Upvotes: 6

Related Questions