【问题标题】:Doubts in the strcpy function used使用的 strcpy 函数的疑问
【发布时间】:2011-08-21 06:42:12
【问题描述】:

我正在使用unsigned char 的两个缓冲区,当我使用函数strcpy 时,出现编译错误,提示“unsigned char * 到 char * 的无效转换”。谁能告诉我无符号缓冲区与有符号缓冲区对输出有什么区别?这是我尝试过的程序。

        main()
        {
                unsigned char buff[20] = "Michael";
                unsigned char dst[20] = "Jackson";
                strcpy(buff,dst);
                printf("The string is %s\n",buff);

        }

现在,当我将 strcpy 中传递的参数类型转换为 (char *) 时,该程序可以正常工作,如下所示

        main()
        {
                unsigned char buff[20] = "Michael";
                unsigned char dst[20] = "Jackson";
                strcpy((char *)buff,(char *)dst);
                printf("The string is %s\n",buff);

        }

第二个问题:在字符串函数中对 char* 进行类型转换会产生任何问题吗?

如果您需要更多输入,请告诉我。

【问题讨论】:

  • @Yahia 同意:Maddy,你有几个悬而未决的问题没有被接受;他们真的没有回答您的问题还是您只是不熟悉它的工作原理?

标签: c string


【解决方案1】:

你可以改变:

unsigned char buff[20] = "Michael";
unsigned char dst[20] = "Jackson";

char buff[20] = "Michael";
char dst[20] = "Jackson";

从逻辑上考虑,字符串不能有符号或无符号,它不是一个数值,它只是一个字符数组,你应该这样声明和使用它。

为什么会出现错误?
strcpy 有原型:

char *strcpy(char *restrict s1, const char *restrict s2);

您传递给它的是unsigned char*,当调用函数时,会进行参数类型检查,并且编译器发现您没有使用正确的类型参数调用该函数,因此它会抱怨它,当您应用强制转换函数参数匹配,因此编译通过。

在字符串函数中将类型转换为 char 会产生任何问题吗?*
不,在这种情况下不会。
尽管出于上述答案中提到的原因,更改unsigned char 的用法更有意义。

建议:
Strcpy 不安全,所以你最好使用strncpy,它允许你明确指定要复制多少个字符,而不是依赖于 null源字符串的终止符,这也有助于避免缓冲区溢出,因为您明确指定了长度。

【讨论】:

  • @Als..是的,我已经改变了它,它工作正常。但我想知道为什么不能使用 unsigned char 数组?
  • 嗯,我想只是因为它是这样定义的。 unsigned char 和 char 是两种不同的类型,像“Hello World”这样的字符串文字是一个 char 数组,而不是 unsigned char。 strcpy 函数(以及 strlen、strncpy 等)需要 char*,而不是 unsigned*。
  • 我认为您对 strncpy 的看法不正确,它 does not 添加了一个空终端。
  • @Karl Knechtel:感谢您指出这一点,我更正了它,请随时修改此类拼写错误,甚至添加您可能会觉得改进答案的重要细节,这是允许的,因为它是社区驱动的努力。 :)
  • strncpystrcpy安全。它有一个讨厌的习惯,就是给你一些不是 C 字符串(即,不是以null 结尾的)的东西。下次你尝试用它做一些复杂的事情(比如 strcmp 或 strlen)时,你会遇到未定义的行为领域。
【解决方案2】:

你使用它的方式应该没问题。

但您不应该将unsigned char 数组与字符串处理函数一起使用。在 C 中,字符串是 char 数组,而不是 unsigned char 数组。由于传递给strcpy 会丢弃unsigned 限定符,因此编译器会发出警告。

作为一般规则,不要在不必要的时候不签名。

【讨论】:

  • @cnicutar...编译器抛出错误而不是警告。错误是“unsigned cchar * 到signed char * 的无效转换。所以最好使用始终签名的char数组而不是unsigned字符数组?
  • @Maddy 那是什么编译器。 C 编译器不应该这样做
  • @Maddy 省略“未签名”并不意味着“已签名”;)
  • @cnicutar...我使用的是 DEV C++ 编译器。但据我所知,将 arras 声明为 char buff[20] 意味着有符号数组对吗?
  • @Maddy 错了。您应该使用 C 编译器(C++ 不是 C 的超集)。又错了,char 并不意味着“签名”。
【解决方案3】:

strcpy 想要char * 的,简单明了。将你的缓冲区投射到char *'s,你会没事的。然后首先使用strcpy 会带来整个安全问题...

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2021-05-11
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多