【问题标题】:Assign different strings to char array using a variable使用变量将不同的字符串分配给 char 数组
【发布时间】:2015-02-21 19:18:24
【问题描述】:

输入 lakenum 是 1-5 的整数。给定该整数,该函数应该分配一个名称并将字符串数组返回给主函数,但是我得到了指针错误:

错误:return 从没有强制转换的指针中生成整数
错误:函数返回局部变量的地址

我使用printf ("%s", lakenamer(lakenum));调用函数

int lakenamer(lakenum) {
  char lname[20] = "0";

  if (lakenum == 1) {
    strncpy(lname, "Ontario", 20);
  } else if (lakenum == 2) {
    strncpy(lname, "Erie", 20);
  } else if (lakenum == 3) {
    strncpy(lname, "Huron", 20);
  } else if (lakenum == 4) {
    strncpy(lname, "Muskoka", 20);
  } else if (lakenum == 5) {
    strncpy(lname, "Simcoe", 20);
  }

  printf("%s",lname);
  return (lname);
}

【问题讨论】:

  • strncpy 是个坏主意,您应该改用strcpysnprintf
  • @ThisGuy 如果任何答案对你有帮助,你应该接受并投票赞成。
  • 我不能投票,没有足够的信用,但我最终只是改变了它,以便调用该函数,并打印数据而不是将数据返回给主函数,这更容易

标签: c arrays string variables char


【解决方案1】:

如果要在函数外使用,需要在函数内为字符串动态分配内存。

char* lakenamer( int lakenum )
{
    char* lname = ( char* )malloc( 20 );
    if ( lakenum == 1 )
    {
        strncpy( lname, "Ontario", 20 );
    }
    else if ( lakenum == 2 )
    {
        strncpy( lname, "Erie", 20 );
    }
    else if ( lakenum == 3 )
    {
        strncpy( lname, "Huron", 20 );
    }
    else if ( lakenum == 4 )
    {
        strncpy( lname, "Muskoka", 20 );
    }
    else if ( lakenum == 5 )
    {
        strncpy( lname, "Simcoe", 20 );
    }
    printf( "%s", lname );
    return ( lname );
}

int main()
{
    int lakenum = 1;
    char* s = lakenamer( lakenum );
    printf( "%s", s );

    /*
    .
    .Do other stuff with s
    .
    */

    free( s ); // Very important !!
}

【讨论】:

    【解决方案2】:

    您应该使用char *lakenamer() 并从中返回您的字符串(或strdup(your_string))。

    顺便说一句,您使用的是printf ("%s", lakenamer(lakenum));,因此您需要返回值为char *,但您要返回的是int

    【讨论】:

      【解决方案3】:

      此外,您将 lname 声明为函数中的局部变量,但将指向它的指针返回给您的调用函数。这不好,因为一旦您返回该内存地址,随时可能被覆盖。

      您可以改为让调用者分配内存,并将其地址传递给您,即

      char[20] lname;
      lakenamer(lakenum, lname);
      

      然后在你的函数中你可以将结果strcpy到lname中。然后让 lakenamer 返回 void,如果您想返回成功或错误状态代码,则返回 int。

      【讨论】:

      • char[20] lname; --> char lname[20];
      【解决方案4】:

      错误:return 从没有强制转换的指针中生成整数

      回答:您收到此错误是因为您返回地址并使用 int 进行收集而不进行强制转换。

      错误:函数返回局部变量的地址

      Ans:您遇到上述错误是因为您正在从一个函数返回局部变量地址,而该函数在返回 Main() 函数后将不存在。

      请找到以下解决上述问题的代码。

      #include<stdio.h>
      #include<string.h>
      
      void lakenamer(int, char *);
      
      main(int argc, char *argv[])
      {
          char string[20]={0,};
          lakenamer(atoi(argv[1]), string);
          printf("\nIn Main fn:[%s]\n",string);
      }
      
      void lakenamer(int lakenum, char *str)
      {
          char lname[20] = "0"; 
          //char lname[20] = {0,};
      
          if (lakenum == 1) {
              strncpy(lname, "Ontario", 20); //u can change lname to str
          } else if (lakenum == 2) {
              strncpy(lname, "Erie", 20);
          } else if (lakenum == 3) {
              strncpy(lname, "Huron", 20);
          } else if (lakenum == 4) {
              strncpy(lname, "Muskoka", 20);
          } else if (lakenum == 5) {
              strncpy(lname, "Simcoe", 20);
          }
      
          strcpy(str, lname);
          printf("%s",lname);
          //return (lname);//do not return any reference for local variable
      }
      

      【讨论】:

      • 如果只是提供代码示例,你应该解释你在做什么
      猜你喜欢
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 2014-06-08
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多