使用变量将不同的字符串分配给 char 数组

Assign different strings to char array using a variable

输入lakenum是一个1-5的整数。鉴于该整数,该函数应该为主函数分配一个名称和 return 字符串数组,但我得到了指针错误:

error: return makes integer from pointer without a cast
error: function returns address of local variable

我使用 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);
}

您应该使用 char *lakenamer() 和 return 您的字符串(或 strdup(your_string))。

顺便说一句,您正在使用 printf ("%s", lakenamer(lakenum));,因此您需要 return 值为 char *,但您正在 returning int反而。

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

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

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

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

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

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

错误:return 从指针生成整数而不进行转换

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

错误:函数returns局部变量地址

Ans: 你得到上面的错误是因为你正在 returning 来自一个函数的局部变量地址,在 returning 到 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
}