C Передача динамического массива в функцию - PullRequest
0 голосов
/ 18 ноября 2018
void word(FILE*fptr, char sender[]);

void dosya(){
    FILE *fp1;
    fp1 = fopen("com.txt","r");

    int c, i, sendno=0, receiveno=0;
    char d, e, send, space1, space2, receive;

    char* sender = malloc(sizeof(char));
    while(send != ' '){                     /*read sender's name*/
        send = getc(fp1);
        if(send == ' ')
            break;
        else{
            sender[sendno] = send;
            sendno++;
            sender = (char *) realloc(sender, (sendno+1)*sizeof(char));
        }
     }
     e = getc(fp1);    /* read # character  */

     word(fp1, sender);
     fclose(fp1);

}

void word(FILE*fptr, char sender[]){
     printf("%s", sender);
}

// Driver program to test above functions./
int main()
{
     dosya();
     return 0;
}

Я создаю динамический массив sender с malloc и перераспределяю его каждый раз, когда читаю письмо, он останавливается, когда буква является пробелом. Я хочу использовать этот массив в другой функции. Как я могу достичь этого в функции слова?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Измените void dosya() прототип на char *dosya(). Вернуть выделенное sender в main(), сохранить его в переменной, отправить в word() и освободить выделенную память в конце концов.

Вот так:

char *dosya() {
    // ...
    // collect data
    // ...

    return sender;
}

//...

int main()
{
    FILE *fptr;
    char *p;
    // ...
    // open file for fptr
    //
    if (fptr == NULL)
        return -1;

    p = dosya();

    if (p != NULL) {
        word(fptr, p);
        free(p);
    }
    return 0;
}
  • Не забудьте проверить malloc() и realloc() возвращаемое значение для NULL (недостаточно памяти);
  • Не забудьте добавить '\0' разделитель в конце sender после того, как все необходимые символы сохранены;
  • realloc() для каждого персонажа очень неэффективный способ, но он выходит за рамки оригинального вопроса.
0 голосов
/ 18 ноября 2018

getc() не имеет четкого указания на состояние EOF(=end of file), что делает его бесконечным циклом, если в вашем файле нет символа пробела.Именно поэтому ваша функция печати никогда не вызывается.

Есть несколько других проблем, которые делают ваш код довольно трудным для чтения, поэтому его может быть так сложно отлаживать.

Поэтому я бы посоветовал вам переработать вашу программу следующим образом:

  1. создать отдельную функцию, которая проверяет, существует ли файл
  2. использовать значимую переменнуюобъявления и не объявляйте переменные, которые вы не используете
  3. используйте fgets или подобное для чтения файла построчно, а затем перебирайте буфер, ища символ пробела или eof.
  4. realloc()для каждого символа избыточно, вместо этого подсчитайте символы в цикле, а затем динамически создайте массив с помощью malloc и сохраните введенные данные с помощью strncpy / memcpy или аналогичного

Код:

    int Exists(const char *path)
{
    if (fopen(path, "r") == NULL)
    {
        return -1;
    }
    fclose();
    return 1;
}
    void ReadLine(const char *path)
{
    if (Exists(path) == -1)
    {
        printf("file doesnt exist \n");
    }
    else
    {
        char buffer[256];
        FILE *fp = fopen(path, "r");
        char *key = (char*)malloc(sizeof(char));
        int n = 0;
        while (fgets(buffer, 255, fp) != NULL) // read file till newline/255 c limit
        {
            for (int i = 0; i < sizeof(buffer) / sizeof(char); i++)
            {
                if (buffer[i] == ' ' || buffer[i] == '\n')
                {
                    if (i > (strlen(key)))
                    {
                        (char*)realloc(key, i * sizeof(char));
                    }
                    strncpy(key, buffer, i);
                    key[i] = '\0';
                    break;
                }
            }
            //key now holds value of words separated by whitespace or newline character
        }
    }
fclose();
free(key);
}
...