Can';t将常量char*分配给char*

Can';t将常量char*分配给char*,c,pointers,C,Pointers,我用C写,必须返回一个字符* 我试图复制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); pr

我用C写,必须返回一个字符* 我试图复制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;
}
intmain()
{
char-tmp[100];
char*cpyString;
常量字符*cPtr=&tmp[0];
printf(“输入单词:”);
fflush(stdin);
scanf(“%s”和tmp);
cpyString=strcpy(“样本”,cPtr);
printf(“新计数为%d\n”,strlen(cpyString));
}
整数strlen(字符*s)
{
整数计数=0;
而(*(s)!=0x00)
{
计数++;
s=s+0x01;
}
返回计数;
}
char*strcpy(char*dest,const char*src)
{
char*retPtr=dest;
int i=0;
int srcLength=strlen(src);
对于(i=0;i
问题1:我如何将src上的解引用值分配给目标,而不会导致程序崩溃


问题2:如果我需要将输入的
tmp
字符串复制到一个新字符串中,我将如何操作?我似乎无法将
tmp
作为第二个参数传递

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

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*
mstrcpy(char*dest,const char*src)
{
char*retPtr=dest;
int i=0;
int srcLength=strlen(src);
对于(i=0;i
请注意,在main函数中,如果使用
char a=“abc”
,则会导致问题,因为它是指向常量的指针

cpyString = strcpy("Sample", cPtr);
                   ^^^^^^^
                   const
您已经交换了参数。第一个参数是不允许写入的字符串文字(“示例”)。看

试一试

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

也许你真的想要:

cpyStringBuffer[100];
cpyString = strcpy(cpyStringBuffer, cPtr);
一般来说,
main
中的代码比需要的复杂

尝试:


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

char dest[const_size]
所以

char*strcpy(char*dest,const char*src)
{
char*retPtr=dest;
int i=0;
int srcLength=strlen(src);
对于(i=0;i
我想您可能希望编写如下代码

#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;
}
#包括
int strlen(字符*s);
char*strcpy(char*dest,char*src);
int main()
{
char-tmp[100];
char-cpyString[100];
printf(“输入单词:”);
fflush(stdin);
scanf(“%s”和tmp);
strcpy(cpyString,tmp);
printf(“新计数为%d\n”,strlen(cpyString));
}
整数strlen(字符*s)
{
整数计数=0;
而(*(s)!=0x00)
{
计数++;
s=s+0x01;
}
返回计数;
}
char*strcpy(char*dest,char*src)
{
char*retPtr=dest;
int i=0;
int srcLength=strlen(src);
对于(i=0;i
  • 在main函数中调用strcpy()时,参数src和dest是相反的
  • 如果您想使用变量cpysting,那么您应该确定从静态还是动态分配内存块。
    • 在我的示例中,我将cpyString声明为一个字符数组。这意味着变量将部分占用静态内存
    • 您也可以通过调用malloc()calloc()函数为其分配字节的动态内存

  • 无法重现错误。请包含您的编译器并演示如何使用strcopy
    。我们需要查看调用
    strcopy
    函数的代码以及它为
    dest
    参数指定的参数值。您不需要调用
    strlen
    -您只需检查
    *src='\0'
    并停止循环即可。请提供。我怀疑您的
    dest
    可能是调用者中未初始化的指针。最后,“在这一行程序中断”不是一个有用的注释,请准确描述“中断”。编写
    strcpy
    时无需调用
    strlen
    。。。实际上,您降低了它的效率(您在源字符串上迭代了两次,但没有充分的理由)。一般来说,
    strcpy
    的一个常见实现有三分之一的行(紧凑的是三行)。
    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;
    }
    
    #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;
    }