2015-02-21 2 views
-1

Вход lakenum является целым числом от 1 до 5. Учитывая, что число, то функция должна присвоить имя и возвращает массив строк в основную функцию, но вместо этого я получаю ошибки указателя:Назначение различных строк массиву char с использованием переменной

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); 
} 
+0

'strncpy' - плохая идея, вы должны использовать' strcpy' или 'snprintf' вместо этого. –

+0

@ThisGuy Вы должны принять и поддержать любые ответы, если они вам помогут. –

+0

Я не могу проголосовать недостаточно, но я просто изменил его так, чтобы функция вызывалась, и печатала данные вместо того, чтобы возвращать данные обратно к основной функции, было проще – ThisGuy

ответ

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

You должен использовать char *lakenamer() и вернуть вашу строку (или strdup(your_string)).

Кстати, вы используете printf ("%s", lakenamer(lakenum));, поэтому вам нужно вернуть значение char *, но вместо этого вы возвращаете int.

0

Также вы объявляете lname как локальную переменную в своей функции, но возвращаете указатель на нее к вашей вызывающей функции. Это плохо, потому что как только вы вернетесь, адрес памяти может быть написан в любое время.

Вы могли бы вместо этого вызывающего выделить память, и передать его адрес к вам, то есть

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

Тогда внутри вашей функции вы можете STRCPY результата в LName. Затем запустите lakenamer return void или int, если вы хотите вернуть код успеха или код ошибки.

+0

'char [20] lname ; '->' char lname [20]; ' –

-1

ошибка: возвращение делает целое число от указателя без приведения

Ans: Вы получаете эту ошибку, потому что вы возвращаете адрес и сбор с междунарами без броска.

ошибка: функция возвращает адрес локальной переменной

Ans: Вы получаете выше ошибки, потому что вы возвращаете локальный адрес переменной из функции, которая будет существовать привычка после возвращения в основной функции().

Пожалуйста, найдите нижеприведенный код, который решает проблему выше.

#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 
} 
+0

Вы должны объяснить, что вы делаете, вместо того, чтобы просто дать образец кода –

Смежные вопросы