C выделить строку, не зная количество символов - PullRequest
0 голосов
/ 19 января 2012

Мне нужно получить строку без запроса длины, я создаю буфер из 100 символов и, когда он заполняется, я делаю realloc для добавления пробела для символа в конце строки

thisмой код ... не могли бы вы мне помочь?

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

int main(int argc, char **argv)
{   
    char *content = malloc(10*sizeof(char));
    char c;
    content[0]='\0';

    while ((c = getchar()) != EOF)
    {
        if (strlen(content) < 10){
            strcat(content, &c);
            content[strlen(content)+1] = '\0';
        }
       else {
            content=realloc(content,sizeof(char)*(strlen(content))+2);
            strcat(content, &c);
            content[strlen(content)+1] = '\0';
        }
    }
    printf("%s",content);       

    return 0;
}

Ответы [ 2 ]

2 голосов
/ 19 января 2012

Несколько вопросов здесь:

  1. не используйте strcat вот так!Вы должны передать указатель на \0 завершенную строку вместо указателя на один символ.Это работает только случайно.
  2. Отслеживайте выделенный объем памяти в отдельной переменной, вместо использования strlen().
  3. Отслеживайте положение в строке с помощью другой отдельной переменной,не звоня strlen() постоянно.Установите завершающий \0 один раз после завершения цикла.
  4. лучшей стратегией перераспределения было бы увеличение выделения памяти в блоках, то есть не для каждого байта.Вы можете выделять X байтов каждый раз, когда ваша выделенная память исчерпывается, или вы можете удвоить количество выделенных байтов.
0 голосов
/ 19 января 2012

Вы должны сделать то, что предложил @cnicutar:

content[index] = c;

Также в вашем коде есть другая проблема. Когда вы объединяете «c» в «content», вы перезаписываете «\ 0» в конце «content». Помните, что strlen будет искать '\ 0'.

Другая проблема:

content[strlen(content)+1] = '\0';

Когда ваш strlen равен 9, вы будете помещать '\ 0' в content [10]. Вы выделили «контент» размером 10, так что это означает, что он переходит от контента [0] к контенту [9].

Простой

content[strlen(content)] = '\0';

Должен делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...