Использование массива с указателями в C - PullRequest
3 голосов
/ 07 декабря 2010

Здравствуйте, я практикую C, и у меня есть небольшая проблема со следующим кодом. Прежде всего, моя программа просто читает ввод от пользователя и, если есть доступная память, сохраняет ее, в противном случае она ничего не делает.

У меня есть массив указателей на char, называемый "lines", и массив символов для временного хранения ввода, называемого "line".

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

#define MAXWIDTH 81
#define MAXLINES 100

int main ()

{
    char* lines [MAXLINES];   
    char line[MAXWIDTH];
    int i ;
    int n ;


Затем я проверю, есть ли в моем массиве указателей место, и входные данные отличны от нуля. Я делаю это в цикле for, чтобы заполнить массив, и обычно цикл for должен останавливаться, когда я ничего не печатаю и просто нажимаю ввод или когда массив заполнен. Если есть место, я проверю, достаточно ли памяти в пространстве, на которое указывает указатель. Если все в порядке (! = NULL), программа копирует данные из get (line) в память.

for (n = 0; n < MAXLINES && gets(line) != NULL; n++)    

        {
            if ((lines[n] = malloc(strlen(line) + 1)) == NULL)  
                exit (1);
            strcpy(lines[n], line);                             
        }


Остальная часть кода предназначена только для вывода и освобождения памяти.

    for (i = 0; i < n; i++)
        {
            puts(lines[n-i-1]);
            free(lines[n-i-1]);
        }


    return 0;
}


Теперь проблема в том, что программа работает без ошибок, но она работает не так, как я хочу. Это просто выполнение бесконечного цикла, где я могу печатать столько, сколько захочу, что я хочу, без какой-либо реакции.

Ответы [ 4 ]

4 голосов
/ 07 декабря 2010

gets не возвращает NULL при вводе пустой строки, если вы пытались это проверить.Это все еще будет пустая строка.Вам нужно проверить, является ли первый символ \0, если вы хотите искать пустые строки.

Что касается примечания, gets крайне небезопасно, поскольку он переполнит ваш буфер, если ваша строкаслишком длинный и вызывает злые ошибки.Вместо этого используйте fgets, это позволит вам указать размер буфера.(Обратите внимание, что fgets добавит \n в конец вашей строки, даже если это пустая строка.)

3 голосов
/ 07 декабря 2010

Ну, для начала я предлагаю прочитать следующее о том, почему вы должны избегать использования gets(). Я предлагаю использовать scanf() или fgets() вместо ...

http://www.gidnetwork.com/b-56.html

затем обратите внимание, что вы делаете цикл до 100, принимая входные данные, и только после всех 100 вы выводите. Поэтому вам нужно ввести 100 строк ввода, прежде чем вы увидите что-нибудь ...

2 голосов
/ 07 декабря 2010

Вы не проверяете пустую строку.

Вам нужно что-то вроде:

if('\0' == line[0])
{
    break;
}

И используйте fgets (), а не gets ().Это безопаснее.Однако тогда вам нужно сделать:

if('\n' == line[0] || '\r' == line[0])
{
    break;
}
1 голос
/ 07 декабря 2010

Ну, как вы прекращаете ввод? Ввод пустой строки не поможет, потому что строка будет "", а не NULL. Вы пытались нажать Ctrl + Z в консоли (если это окна)?

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