Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Вывод массива char из функции (http://forum.oszone.net/showthread.php?t=313722)

kennydzzze 11-04-2016 08:42 2625015

Вывод массива char из функции
 
Не получается вывести значения массива в main, который заполняется внутри функции. Вместо 'a' символов выводит случайные символы.
PHP код:

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

void f(char *cint *n

    *
n=10
    
c=(char*)malloc(*n+1); 
    for(
int i=0i<*ni++) 
    { 
        
c[i]='a'
    } 

int main() 

    
int a
    
char *c

    
f(c,&a); 
    for(
int i=0i<a+1i++) 
    { 
        
printf("%c",&c[i]); 
    } 
    
system("pause"); 



User001 11-04-2016 14:54 2625133

Цитата:

Цитата kennydzzze
void f(char *c, int *n)»

Надо передавать указатель на указатель, если вы хотите его изменять.
Код:

void f(char **c, int *n)
Соответственно:
Цитата:

Цитата kennydzzze
c=(char*)malloc(*n+1);»

Код:

*c = (char*)malloc(*n+1);
Цитата:

Цитата kennydzzze
c[i]='a';»

Код:

(*c)[i]='a';
Тут в принципе неверно:
Цитата:

Цитата kennydzzze
printf("%c",&c[i]);»

Код:

printf("%c", c[i]);
А еще надо память и освобождать.

И основной вопрос - зачем вам вообще вся эта адресная арифметика?

kennydzzze 11-04-2016 18:21 2625200

Спасибо, помогло.

Цитата:

Цитата User001
void f(char **c, int *n) »

Я думал так передаются двумерные динамические массивы, точнее указатели на них.

Цитата:

Цитата User001
А еще надо память и освобождать. »

Это да, но тут не думаю, что это нужно, это как образец.

Цитата:

Цитата User001
И основной вопрос - зачем вам вообще вся эта адресная арифметика? »

Пишу консольное приложение генератор паролей с функционалом.

п.с. в мейне я тогда должен передавать адрес одномерного массива в функцию? f(&c, &a);

User001 11-04-2016 20:20 2625222

Цитата:

Цитата kennydzzze
Я думал так передаются двумерные динамические массивы, точнее указатели на них. »

Смотря как вы используете это. В вашем случае была проблема - у вас есть переменная типа (char *) вы ее передаете в функцию (в ней это другая - локальная переменная) и внутри нее меняете значение. После выхода функции вы уже работаете с переменной, определенной в контексте метода main(), поэтому, значение не сохраняется.
Цитата:

Цитата kennydzzze
Это да, но тут не думаю, что это нужно, это как образец. »

Привыкайте делать сразу. И продумайте где выделять память и где освобождать.
Цитата:

Цитата kennydzzze
п.с. в мейне я тогда должен передавать адрес одномерного массива в функцию? f(&c, &a); »

Да.

kennydzzze 14-04-2016 17:49 2626162

User001, Не могли бы вы прояснить ситуацию с передачей двумерных динамических массивов? Задача та же самая, нужно передать массив типа char, только уже двумерный, забить значениями и вывести его в main:
PHP код:

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

void f(char ***cint *n

    *
n=10;

    *
c=(char**)malloc(*n*sizeof(char*));
    for (
int i=0i<*ni++)
    {
        (*)
c[i]=(char*)malloc(5*sizeof(char));    //[Error] expected primary-expression before ')' token
    
}

   for(
int i=0i<*ni++)
    { 
        (*)
c[i]='a';    //[Error] expected primary-expression before ')' token
    
}

int main() 

    
int a=0
    
char **c

    
f(&c,&a);

    for(
int i=0i<ai++) 
    { 
        
printf("%s\n",c[i]); 
    } 

    for (
int i=0i<ai++)
    {
        
free(c[i]);
    }
    
free(c);
    
  
system("pause"); 


Код не компилируется, выводит ошибки на 11 и 16 строки(указал в комментариях кода). Компилятор dev-cpp 5.11

User001 15-04-2016 07:38 2626323

Цитата:

Цитата kennydzzze
(*)c[i]=(char*)malloc(5*sizeof(char)); »

(*c)[i]
Цитата:

Цитата kennydzzze
(*)c[i]='a'; //[Error] expected primary-expression before ')' token »

(*c)[i][j]. Соответственно - внутренний цикл еще один нужен, т.к. массив 2-мерный.
Цитата:

Цитата kennydzzze
printf("%s\n",c[i]); »

printf("%c\n", c[i][j]);

И почините оформление.

kennydzzze 15-04-2016 11:49 2626406

Цитата:

Цитата User001
(*c)[i][j] »

Видимо я вчера совсем перенапрягся после учебы... Спасибо.

Цитата:

Цитата User001
printf("%c\n", c[i][j]); »

Здесь не вижу никакой ошибки, %s выводит строку [i]. Все норм было.

Цитата:

Цитата User001
И почините оформление. »

Какое оформление? Темы? Что не так с ним?

User001 15-04-2016 14:21 2626505

Цитата:

Цитата kennydzzze
Здесь не вижу никакой ошибки, %s выводит строку [i]. Все норм было. »

Я вашей задумки не знаю. Если это массив строк, то не забывайте +1 символ выделять для \0.
Цитата:

Цитата kennydzzze
Какое оформление? Темы? Что не так с ним? »

Я про оформление кода: пробелы после for, константы (5) посреди кода и т.д.


Время: 12:22.

Время: 12:22.
© OSzone.net 2001-