2015-04-07 2 views
-1

Я новичок в управлении C/указателями/памятью, и у меня возникли проблемы с выполнением нескольких функций для проекта, над которым я работаю.C: Возвращающаяся строка из другой функции

В моем файле builtins.c у меня есть функция printalias, которая вызывается для печати всех имен псевдонимов и соответствующих значений, сохраненных в моей программе. В конце я хочу напечатать одно из имен псевдонимов, извлекая его с помощью другой функции getal.

int x_printalias(int nargs, char *args[]) { 
    int i = 0; 
    // Loop through, print names and values 
    for(i = 0; i< 100; i++) 
    { 
    if(alias_names[i][0]!='\0' && !alias_disabled[i]) 
    { 
     char * var = alias_names[i]; 
     char * val = alias_vals[i]; 
     fprintf(stderr,"%s = %s\n", var, val); 
    } 
    } 
    // This is where I want to retrieve the string from another function 
    char * hello = "brett"; 
    hello = getal(hello); 
    fprintf(stderr,"Got alias for brett --> %s",hello); 
    return 0; 
} 

Моя getal функция существует в моем файле shellParser.c и выглядит, как правило, выполняет ту же зацикливание и возвращение, когда он находится:

const char * getal(int nargs, char *args[]) 
{ 
    fprintf(stderr,"\nRetrieving alias...\n"); 
    int i = 0; 
    fprintf(stderr, "check1\n"); 

    fprintf(stderr,"Got args[0]: %s\n", args[0]); 

    while (alias_names[i][0]!='\0' && i < MAX_ALIAS_LENGTH) // Find empty slot in variables array 
    { 
    fprintf(stderr, "check2\n"); 

    fprintf(stderr,"I is currently %i and current varible in slot is %s\n",i,alias_names[i]); 
    //strncpy(hello, variables[i], MAX_VAR_LENGTH); // Variable at current slot 
    if(strcmp(alias_names[i], args[0]) == 0) // If we have an entry, need to overwrite it 
    { 
     fprintf(stderr,"Found alias %s = %s at spot %i\n",args[0],alias_vals[i], i); // Not at end if here 
     return alias_vals[i]; 
    } 
    i++; 
    } 
    fprintf(stderr, "check3\n"); 

    // Elided.... 

    return '\0'; 
} 

В конце моей printalias функции я хотите проверить, что эта функция getal работает, вызывая ее на жестко закодированной строке «brett». Однако, когда я вызываю свой printalias function из командной строки, он переводит его в инструкцию печати «Проверить 1», а затем просто завершает работу без ошибки или возвращаемого значения.

Я думаю, что это имеет какое-то отношение к управлению памятью или неправильному объявлению переменных с помощью указателей. Может ли кто-нибудь обнаружить что-то (или много чего), что я здесь делаю неправильно?

+3

Вы называете 'getal' функции с одним аргументом типа' '* полукокса и ваше определение этой функции говорит, что требуется два аргумента типов 'int' и' char * [] '. –

+0

Если вы хотите использовать переменные-аргументы в 'getal', вам нужно будет' #include 'и объявить' const char * getal (int, ...) '. Эллипсис сообщает компилятору, что функция принимает переменные аргументы. Используйте 'va_start()' для инициализации 'переменной', которую вы хотите, например,' args' в вашем случае. И используйте 'va_end()' для очистки используемой памяти. – alvits

+0

Возможный дубликат [Возврат строки из функции в C] (http://stackoverflow.com/questions/9378998/returning-a-string-from-a-function-in-c) – Mgetz

ответ

0

Вы должны объявить список аргументов для звонка getal, и он звонит с этими . и указатель возвращаемых значений getal должны быть const char*

//.... 
    // This is where I want to retrieve the string from another function 
     char * hello[] = {"brett"}; // this list argument for getal function 
     const char *strGetal; 
     strGetal = getal(1,hello); 
     fprintf(stderr,"Got alias for brett --> %s",strGetal); 
     return 0; 
    } 
-1

Пример:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


char** get_all(int argc, char **argv) 
{ 
    char *value; 
    char **values = NULL; 
    int i; 

    values = (char**) malloc(sizeof (char) * argc); 
    if (values == NULL) { 
     perror("malloc"); 
     return NULL; 
    } 


    for (i = 0; i < argc; i++, argv++) { 
     value = strchr(*argv, ':'); 
     values[i] = (value + 1); 
    } 

    return values; 
} 

int main() 
{ 
    char *args[] = {"key:a", "key:b", "key:c"}; 
    char **values; 
    int i; 

    values = get_all(3, args); 

    for (i = 0; i < 3; i++) { 
     puts(values[i]); 
    } 

    return 0; 
} 
Смежные вопросы