Сбой программы после ввода одной строки.Как исправить? - PullRequest
0 голосов
/ 02 января 2019

Я сделал программу getline своей функции.Который принимает данные до тех пор, пока не встретится «\ n», и не перейдет к следующему.Также я использовал массивы указателей для хранения строковых входных данных, но программа падает после первого строкового ввода.В чем проблема?

Это код программы.Я пытался его отладить, но это не помогло найти проблему.

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

void getline2(char *s)
{
    char c;
    while((c=getchar())!='\n')
    {
        *s=c;
        s++;
    }
    *s='\0';
}

int main()
{
    char *lines[3];
    int i=0;
    while(i<3)
    {
        getline2(lines[i]);
        i++;
    }
    for (i = 0; i < 3; i++)
    {
        printf("\n%s", lines[i]);
    }
    return 0;
}

Когда я вводил первую строку после нажатия клавиши ввода, программа вылетала.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

В дополнение к предоставлению char*, который указывает на действительную память (также предложенную другими), getline2() имеет и другие недостатки для адресации.

Неизвестный размер

getline2() не знает, сколько символов можно сохранить. Предложите принять параметр размера и скорректировать код, чтобы предотвратить переполнение s.

// void getline2(char *s)
void getline2(char *s, size_t sz)

Бесконечный цикл включен EOF

Когда stdin закрывается или возникает редкая ошибка ввода, getchar() может постоянно возвращать EOF и никогда не выходить из цикла.

257 значения не вписываются в char

int fgetc() возвращает значения в диапазоне unsigned char и EOF. Используйте int c; и тестовый цикл для c != '\n' && c != EOF

// char c;
// while((c=getchar())!='\n')
int c;
while((c=getchar())!='\n' && c != EOF)
0 голосов
/ 02 января 2019

В вашем коде char *lines[3]; определяет массив из char указателей. Сами указатели не указывают на любую действительную память , автоматически . Если не инициализировать должным образом, попытка использовать их (или отменить ссылку) приведет к неопределенному поведению .

Существует два распространенных подхода к достижению того, что вы хотите (в зависимости от ваших требований):

  • Выделите размер во время компиляции и ограничьте длину вашего ввода [т.е. передайте размер буфера в качестве аргумента функции, например, fgets()]
  • Выделение памяти во время выполнения (функции распределителя, malloc() и семейство ) и изменение размера в зависимости от длины ввода.
...