繁体   English   中英

无法将const char *分配给char *

[英]Can't assign const char* to char*

我正在用C编写并且必须返回一个char *,我正在尝试复制strcpy函数。 我有以下代码

int main() 
{
    char tmp[100];
    char* cpyString;
    const char* cPtr = &tmp[0];

    printf("Enter word:");  
    fflush(stdin);
    scanf("%s", &tmp);

    cpyString = strcpy("Sample", cPtr);

    printf("new count is %d\n", strlen(cpyString));

}

int strlen(char* s)
{
   int count = 0; 

   while(*(s) != 0x00) 
   {
      count++;
      s = s+0x01;
   }
   return count;
}

char* strcpy(char* dest, const char* src)
{
    char* retPtr = dest;

    int i =0;
    int srcLength = strlen(src);

    for(i = 0; i< srcLength; i++)
    {           
       *(dest) = *(src); //at this line program breaks
        dest = dest + 0x01;
        src = src + 0x01;
    }

    *(dest) = 0x00; //finish with terminating null byte

     return retPtr;
}

Q1:如何在程序不崩溃的情况下将src处的解引用值分配给目标?

Q2:如果我需要将输入的tmp字符串复制到新字符串中,该怎么办? 我似乎无法通过tmp作为第二个参数

这里

cpyString = strcpy("Sample", cPtr);
                   ^^^^^^^
                   const

您已交换参数。 第一个参数是不允许写入的字符串文字(“样本”)。 参见https://stackoverflow.com/a/4493156/4386427

尝试

cpyString = strcpy(cPtr, "Sample");

我不确定第二行是否正是您想要的,但至少是合法的。

也许您真的想要:

cpyStringBuffer[100];
cpyString = strcpy(cpyStringBuffer, cPtr);

通常,您的main的代码比所需的更为复杂。

尝试:

int main() 
{
    char input[100] = {0};
    char dest[100];

    printf("Enter word:");  
    scanf("%99s", input);     // notice the 99 to avoid buffer overflow

    strcpy(dest, input);

    printf("new count is %d\n", strlen(dest));

    return 0;
}

我想您可能想像下面这样编码。

#include <stdio.h>

int strlen(char* s);
char* strcpy(char* dest, char* src);

int main() 
{
    char tmp[100];
    char cpyString[100];

    printf("Enter word:");  
    fflush(stdin);
    scanf("%s", &tmp);

    strcpy(cpyString, tmp);

    printf("new count is %d\n", strlen(cpyString));

}

int strlen(char* s)
{
   int count = 0; 

   while(*(s) != 0x00) 
   {
      count++;
      s = s+0x01;
   }
   return count;
}

char* strcpy(char* dest, char* src)
{
    char* retPtr = dest;

    int i =0;
    int srcLength = strlen(src);

    for(i = 0; i< srcLength; i++)
    {           
       *(dest) = *(src); //at this line program breaks
        dest = dest + 0x01;
        src = src + 0x01;
    }

    *(dest) = 0x00; //finish with terminating null byte

     return retPtr;
}
  1. 当您在主函数中调用strcpy()时,参数src和dest将被反转。
  2. 如果要使用变量cpyString,则应该确定从静态还是动态分配哪个内存。
    • 在我的示例中,我将cpyString声明为字符数组。 这意味着该变量将部分占用静态内存。
    • 您也可以通过调用malloc()calloc()函数为其分配动态内存的字节。

我认为您使用了未初始化的目标和文字字符串指针。 您必须将目的地声明为缓冲区,例如

char dest[const_size]

所以

char* strcpy(char* dest, const char* src)
{
char* retPtr = dest;

int i =0;
int srcLength = strlen(src);

for(i = 0; i< srcLength; i++)
{
   *(dest) = *(src); //at this line program breaks
    dest = dest + 0x01;
    src = src + 0x01;
}

*(dest) = 0x00; //finish with terminating null byte

 return retPtr;
}



int main()
{
 char *arr="xxxxxx";

char *dest="fffff";  // this won't work because you can not modify const string
char *dest_1;   // this won't work because it is uninitialized pointer
char dest_2[50]; // this will work fine 
strcpy(x, y);


 printf("%s",x);
     //x still the same as point pointer

return 0;
}

您的程序崩溃,因为您无法将指针修改为常量。 请在下面找到更正的代码:

char *
mstrcpy (char *dest, const char *src)
{
  char *retPtr = dest;

  int i = 0;
  int srcLength = strlen (src);

  for (i = 0; i < srcLength; i++)
    {
      *(dest) = *(src);     //now doesn't break at this line
      dest = dest + 1;
      src = src + 1;
    }

  *(dest) = 0x00;       //finish with terminating null byte

  return retPtr;
}


int
main ()
{

  //char a = "abc";    // will cause crash
  char a[] = "abc";    // won't crash
  char *b = "xyz";

  mstrcpy(a,b); //works fine !!!!
  return 0;

}

请注意,在主函数中,如果使用char a = "abc" ,则会引起问题,因为其指向常量的指针

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM