Помогите написать функцию gettring - PullRequest
0 голосов
/ 15 апреля 2010

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

С уважением, В

const char* getstring()
{


    char *buffer;
    int i = 255;

    buffer = (char *)malloc(i*sizeof(char));

    *buffer = getchar();
    while ( *buffer != '\n' )
    {
        buffer++;
        *buffer = getchar();
    }
    *buffer = '\0';

    const char* _temp = buffer;
    return _temp;
}


int main()
{
    char* temp = getstring();

    for ( ;temp++ ; *temp != '\0')
    {
        printf("%c", *temp);
    }

    return 0;
}

Ответы [ 4 ]

2 голосов
/ 15 апреля 2010

Вы устанавливаете _temp на buffer, когда последний указывает на завершающую '\0' строки.

Переместить строку:

const char* _temp = buffer;

сразу после строки:

buffer = (char *)malloc(i*sizeof(char));

так что _temp указывает на начало буфера.

У вас есть другие проблемы:

  1. Не используйте имя _temp - имена с начальным подчеркиванием зарезервированы;

  2. Вам нужно проверить, что вы не записываете в буфер больше, чем i байтов;

  3. Вы должны проверить на malloc() возвращение NULL;

  4. Вам нужно проверить на getchar() возвращение EOF. Это будет означать, что вам нужно сохранить результат getchar() в переменной типа int, прежде чем присваивать ее *buffer;

  5. Как отметил в комментарии Майкл Мрозек, выражения в вашем цикле for неверны.

... и, как точка стиля, sizeof(char) всегда равен 1, поэтому умножение на него не нужно; и приведение результата malloc() не является необходимым в C и считается нежелательным (в отличие от C ++, где это требуется).

2 голосов
/ 15 апреля 2010

Почему бы просто не использовать

char buffer[255];
scanf("%254s", &buffer);

или

char* buffer = readline("GO GO GO:");
1 голос
/ 15 апреля 2010
const char* _temp = buffer;

Переместить приведенный выше оператор сразу после вызова на malloc

Важно:
Свободно памяти, выделенной для buffer после ее использования в main().

free(temp);
0 голосов
/ 15 апреля 2010

Вам необходимо отслеживать выделенный указатель - значение, возвращаемое malloc() - сразу после вызова malloc(), чтобы вы могли передать его вызывающей стороне. Вы также должны проверить EOF, а также символ новой строки - и для этого требуется int (не char) для хранения значения от getchar(). Как минимум!

...