Программа внезапно ломается в операторе if - PullRequest
0 голосов
/ 28 апреля 2020

Итак, я делаю это задание. Моя работа состоит в том, чтобы сделать две функции, char* readLine(), которые должны читать одну строку из стандартного ввода и возвращать указатель на эту строку.

Другая функция - char** readLines(int *n), которая должна считывать пару строк (разделенных новой строкой) из стандартного ввода и возвращать массив указателей на символы, где каждый указатель указывает на одну из введенных строк. Также предполагается, что функция возвращает количество строк, прочитанных указателем int *n. Процесс повторяется до тех пор, пока не будет введена пустая строка (фактически нажатием только ввода).

Вот как я это сделал:

#include <stdlib.h>
#define MAX 100
#define WRD 20

char* readLine() {
    char *p, *first; // declaring pointers
    p = (char*)malloc(WRD*sizeof(char)); // WRD stands for maximum word length
    if (p == NULL) exit(1);
    first = p; // remebering the position of first char in string

    // put every char in string, stop when you hit enter. next line is overwriting new line with string escape.
    while ((*p++ = getchar()) != '\n');
    *--p = '\0';

    // return start position of string
    return first;
}

char** readLines(int *n) {
    char** p;
    char* temp;
    p = malloc(MAX*sizeof(char*)); // allocate space for array of char pointers
    int i = 0;
    while (1) {
        temp = readLine(); // keep readLine() pointer in temporary variable
        printf("%p\n", temp);
        if (*temp == '\0') // check if it's empty string, if yes break the loop
            break;
        else
            *(p+i) = temp; // if it's not empty, write it in the array of char pointers
        i++; // increment counter by one
    }
    printf("break"); //this doesn't even get executed at all

    *n = i; // dereference pointer with number of inputted words
    return p; //return an array of char pointers
}

int main() {
    int *n;
    char **p;
    p = readLines(n);
    printf("success");
    printf("%d", *n);
}

Странная вещь в том, что если я просто скопирую paste char** readLines() Блок в int main(), все в порядке. Я получаю "break" в качестве вывода, что никогда не происходит при реализации, которую я предоставил. Код завершается в строке if (*temp == '\0'), когда указана пустая строка, только команда выводит команду «Команда прервана».

Почему этот блок кода работает по-разному в функции и в main ()? Заранее спасибо, извините, но я очень новичок в c.

1 Ответ

0 голосов
/ 28 апреля 2020

Ваш n в readLines не обновляет один в main, поскольку вы передаете его по значению (и, что еще хуже, он нигде не указывает конкретно). У вас есть слой *, который вы не должны использовать в main. Измените его следующим образом:

int main() {
    int n;
    char **p;
    p = readLines(&n);
    printf("success");
    printf("%d", n);
}

Что касается отсутствия break, то это потому, что ваша ошибка с n вызвала Неопределенное поведение, что означает буквально все, что разрешено, в том числе путешествие обратно в время, прежде чем вы сделали ошибку, и отмените printf, который уже работал .

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