2015-05-19 3 views
0

Как видите, у меня есть этот код, он принимает команду (char array) и делит ее на два разных массива, если есть «|» между ними. Что я хочу, это не печатать его с помощью функции, а возвращать эти два новых массива на главную, а затем печатать их?Как вернуть Char Array?

Как это сделать?

#include <fcntl.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main() 
{ 
    int a; 
    int status,n,i; 
    char command[4000]; 
    write(STDOUT_FILENO,"Shell>",6); 
    n=read(STDIN_FILENO,command,4000); 
    void getArguments(char **,char*); 
    char *getStdOutFileName(char *); 
    if(n>0) 
    { 
     for(i=0;i<n;i++) 
     { 
      bugrafonk(command,&i); 
      printf("%s",First); 
      printf("%s",Second); 
     } 
    } 
} 

void bugrafonk(char* c,int*length) 
{ 
    int i; 
    int a; 
    char First[4000]; 
    char Second[4000]; 
    for(i=0;i<length;i++) 
    { 
     if(c[i]=='|') 
     { 
      i=a; 
      for(i=0;i<a;i++) 
      { 
       char First[i]; 
      } 
      printf("---"); 
      for(i=a;a<length;i++) 
      { 
       char Second[i]; 
      } 
     } 
    } 
    return(First,Second);     //is this true ? 
} 

В настоящее время существует некоторая декларация nonecssery, поэтому просто избегайте их. Я буду использовать их позже.

+5

Ничего себе. Правильно отформатируйте свой код - это отвратительно. –

+3

Постарайтесь построить его, прочитать ошибки, я имею в виду, на самом деле * читать * их (кажется, это редкость в наши дни), и исправлять ошибки один за другим. Тогда поймите, что вы не можете вернуть указатель на локальный массив, так как массив, как и любая другая локальная переменная, выйдет из области действия после возвращения функции. –

+0

'char * bugrafonk' вместо' void bugrafonk' и 'return First' или' return Second' вместо 'return (char First, char Second)'. –

ответ

1

Для Retun обугленных * к основным вам нужно отправить указатели на вашу функцию, которые прилагаются к памяти, которые вы можете использовать

Например,

.... 
char return1[50] 
char return2[50] 
.... 
split_function(command, return1, return2); 
.... 
1

Ответ зависит от того, где вы храните результаты ваших расчетов. В вашей текущей реализации как First, так и Second массивы выделяются внутри функции bugrafonk и таким образом будут уничтожены, когда функция будет закончена.

Один из возможных вариантов заключается в том, чтобы выделить память для массивов результатов вне функции и передать указатели на функцию.

char first[4000], second[4000]; 
bugrafonk(..., first, second); 
// use first and second 

И bugrafonk реализация:

void bugrafonk(your arguments..., char *first, char *second) 
{ 
    ... 
} 

Кроме того, я понятия не имею, какие загадочное слово bugrafonk средство;)

+1

Bugra - мое имя: D –

+0

Во всяком случае, если я не отправил их в массивы в качестве аргументов в функцию, я не могу их вернуть? –

+1

В C вы можете вернуть только одну переменную из функции. Обычная практика, когда вам приходится возвращать много, - это передать указатели на переменные (или данные) в качестве параметров для функции, изменить переменные/данные внутри функции, а затем просто выйти. Когда функция завершится, у вас будет доступ к вам измененным данным. Если вы абсолютно хотите вернуть несколько параметров, посмотрите на python;) –

0

Функция реализована здесь разбивает строку, прекратив первую часть, и возвращает указатель на вторую часть.

Вам не нужно возвращать 2 части информации, так как вы уже знаете, где находится первая строка. Обратите внимание, что это не сработает, если передается строка строка, поскольку вы не можете ее изменить, но здесь это не так.

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

char* bugrafonk(char* c);     // function prototype 

int main(void) 
{ 
    char command[4000]; 
    char *split; 
    scanf("%3999s", command);    // enter limited length string 
    split = bugrafonk(command);    // this splits the string 
    printf("First part: %s\n", command); // print first half 
    if (split != NULL)      // if there is a second half 
     printf("Second part: %s\n", split); // print second half 
} 

char* bugrafonk(char* c)     // returns string pointer 
{ 
    char *cptr = strchr(c, '|');   // find that char 
    if (cptr != NULL)      // if it was found 
    { 
     *cptr = '\0';      // terminate first part here 
     cptr++;        // advance pointer to next part 
    } 
    return cptr; 
} 

выход программы:

one|two 
First part: one 
Second part: two 
0

Вы можете вернуть указатель на символ, а затем передать два массивы, которые будут изменены в теле функции .:

char *func(char arr[], char* arr2 /* other parameters */) 
{ /* process arr and arr2 */   

    // return new array one. arr2 doesn't need to be returned. 
    return arr; 
} 

// in main: 
char command[4000]; 
char arr2[4000];     // First 
char *arr3 = func(command, arr2); // Second 

Или просто передайте все массивы в качестве аргументов функции, а затем верните void, так как они будут изменены в функции.