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

时间:2015-02-21 19:18:25

标签: c arrays string variables char

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

  

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

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

此外,您将lname声明为函数中的局部变量,但是将指针返回给调用函数。这样做并不好,因为一旦你返回,你的内存地址就可以随时被写下来。

您可以让呼叫者分配内存,并将其地址传递给您,即

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

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

答案 3 :(得分:-1)

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

Ans:您收到此错误是因为您正在返回地址并使用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
}