为什么我不能strcpy?

时间:2018-05-14 21:38:07

标签: c pointers 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;
}

编制警告:

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 :(得分:5)

你做错了:

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

答案 1 :(得分:1)

这里的问题是你试图将C字符串用作字符数组,这当然是允许的,但它与使用它们作为指针 null终止的行为不同字符串。执行hello[0]计算字符串的第一个字符,这通常是一个8位整数。 char是一个值,它不对应于内存地址。 你想要的正确陈述是

strcpy(str, hello);

作为参考,如果你想从字符串中的某个点开始获取一个字符串,你可以这样做

strcpy(str, hello + 1);

对指针执行加法求值为指针,该指针是内存中前进的n个地址。

答案 2 :(得分:0)

Date # Value 20180514 # 3 20180514 # -1 20180514 # -1 20180513 # 2 20180513 # 5 20180513 # -1 的定义需要两个strcpy指针,而不是charstr[]数组。

hello[]