【问题标题】:Why can't I do strcpy?为什么我不能做 strcpy?
【发布时间】:2018-10-24 15:35:48
【问题描述】:
#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;
}

编译警告:

警告:传递 'strcpy' 的参数 1 使指针从整数而不进行强制转换 [-Wint-conversion] 注意:预期的 'char *' 但参数是 'char' 类型 警告:传递 'strcpy' 的参数 2 使指针从整数而不进行强制转换 [-Wint-conversion]

str是一个指针,你好,这是怎么回事?

【问题讨论】:

  • str[i]hello[i] 都不是指针——都是字符。下一个问题是str[14] 不在分配内存的末尾——您分配了 14 个字节,有效索引从 0 到 13。
  • str 是指针,str[i] 不是。
  • strcpy(str, hello) 是正确的调用。
  • ... 没有循环.
  • @PaulHankin strdup 不是标准的。

标签: c pointers strcpy


【解决方案1】:

这里的问题是您尝试将 C 字符串用作字符数组,这当然是允许的,但与将它们用作 pointersnull-terminated的行为不同> 字符串。执行hello[0] 计算为字符串的第一个字符,它通常是一个简单的 8 位整数。 char 是一个值,它不对应于内存地址。 你想要的正确说法是

strcpy(str, hello);

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

strcpy(str, hello + 1);

对一个指针执行加法计算得到一个指针,该指针在内存中向前有 n 个地址。

【讨论】:

  • 您可能想要删除对指针运算的引用 - 这可能与此答案无关,并且通常会令人困惑。
  • 删除了它,但我认为提问者试图通过在接受指针的函数中错误地执行 str[i] 来获取字符串开始的第 i 个点。
  • hello[0] 评估 char 通常是 8 位(但可能不是)并且可以有符号或无符号。只有一些chars 是可打印的字符(特别是isprint(c) 返回非零的非负数)。我认为您的回答在精神上是正确的,但是这些小的技术错误会降低其质量。
  • @PaulHankin 好点,我修复它只是为了澄清 char 是一个值,而不是内存地址或指针。
【解决方案2】:

strcpy 的定义采用两个 char 指针,而不是 str[]hello[] 数组。

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

【讨论】:

    【解决方案3】:

    你做错了:

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

    【讨论】:

    • 您提供了一个正确的实现,但如果它也解释为什么 OP 的代码错误以及错误消息的含义,这将是一个更好的答案。
    • 同意刚刚补充的,也许这将有助于理解问题
    猜你喜欢
    • 2016-03-16
    • 2012-02-17
    • 2020-08-05
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多