【问题标题】:Can't assign const char* to char*无法将 const char* 分配给 char*
【发布时间】:2018-03-21 05:49:39
【问题描述】:

我正在用 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 作为第二个参数传递

【问题讨论】:

  • 无法重现错误。请包含您的编译器并展示您如何使用strcopy
  • 我们需要查看调用您的strcopy 函数的代码以及它为dest 参数分配的参数值。
  • 您无需致电strlen - 您只需检查*src == '\0' 并停止循环。
  • 请提供A Minimal, Complete, and Verifiable Example (MCVE)。我怀疑你的dest 可能是调用者中未初始化的指针。
  • 最后,“at this line program breaks”不是一个有用的评论,请准确描述“breaks”。

标签: c pointers


【解决方案1】:

这里

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

你已经交换了参数。第一个参数是不允许写入的字符串文字(“sample”)。见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;
}

【讨论】:

    【解决方案2】:

    我猜你可能想编写如下代码。

    #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 声明为一个字符数组。这意味着该变量将部分占用静态内存。
      • 您也可以通过调用 ma​​lloc()calloc() 函数为它分配动态内存字节。

    【讨论】:

      【解决方案3】:

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

      这样的缓冲区
      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;
      }
      

      【讨论】:

        【解决方案4】:

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

        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;
        
        }
        

        注意,如果你在 main 函数中使用 char a = "abc" ,那么它会导致问题,因为它是一个指向常量的指针

        【讨论】:

        • 编写strcpy 时无需调用strlen...实际上您正在降低效率(您无缘无故地遍历源字符串两次)。一般来说,strcpy 的常见实现有你三分之一的行(紧凑的实现是三行)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-17
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多