使用的strcpy函数存在疑问

Mad*_*ddy 1 c string

我正在使用两个缓冲区,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);

        }
Run Code Online (Sandbox Code Playgroud)

现在,当我将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);

        }
Run Code Online (Sandbox Code Playgroud)

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

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

Alo*_*ave 6

你可以改变:

unsigned char buff[20] = "Michael";
unsigned char dst[20] = "Jackson";
Run Code Online (Sandbox Code Playgroud)

char buff[20] = "Michael";
char dst[20] = "Jackson";
Run Code Online (Sandbox Code Playgroud)

从逻辑上来看,字符串不能是有符号或无符号的,它不是一个被处理的数值,它只是一个char数组,你应该声明并使用它.

为什么会收到错误?
strcpy有原型:

char *strcpy(char *restrict s1, const char *restrict s2);
Run Code Online (Sandbox Code Playgroud)

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

在字符串函数中对char进行类型转换会产生任何问题吗?*
不,在这种情况下它不会.
虽然unsigned char在答案中出于上述原因更改您的使用情况更有意义.

建议:
Strcpy不安全,因此使用strncpy起来要好得多,它允许您显式指定要复制的字符数,而不是依赖源字符串的空终止符.此外,这有助于避免缓冲区溢出,因为您明确指定了长度.

  • 我认为你对strncpy是不正确的,它[不会](http://www.cplusplus.com/reference/clibrary/cstring/strncpy/)添加一个空终点. (2认同)
  • `strncpy` _not_ 比 `strcpy` 安全。它有一个坏习惯,它会给你一些_不是_C 字符串的东西(即,不是以空字符结尾的)。下次您尝试用它做一些棘手的事情(如 strcmp 或 strlen)时,您将遇到未定义的行为领域。 (2认同)

cni*_*tar 5

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

但是你不应该使用unsigned char带字符串处理函数的数组.在C字符串中是char数组,而不是unsigned char数组.由于传递strcpy丢弃unsigned限定符,编译器会发出警告.

作为一般规则,不要在没有必要的情况下使事情无符号.