Ошибка сегментации при использовании цикла while - PullRequest
1 голос
/ 23 сентября 2019

Я пишу программу, которая берет строку от пользователя и инвертирует регистр букв
Следующий код работает нормально

#define _GNU_SOURCE
#include <stdio.h>
#include <ctype.h>
#include <sys/types.h>


int main(void) {
    printf("Enter line: ");
    char *input_ptr;
    size_t input_length;
    ssize_t read = (int) getline(&input_ptr, (void *) (&input_length), stdin);
    if (read != -1) {
        int i = 0;
        for (; i < input_length; i++) {
            int c = *(input_ptr + i);
            if (isupper(c)) {
                printf("%c", tolower(c));
            } else {
                printf("%c", toupper(c));
            }
        }
    } else {
        puts("Something Wrong Happened ...");
    }
    return 0;
}

Однако, когда я изменяю цикл for на цикл while:

#define _GNU_SOURCE
#include <stdio.h>
#include <ctype.h>
#include <sys/types.h>


int main(void) {
    printf("Enter line: ");
    char *input_ptr;
    size_t input_length;
    ssize_t read = (int) getline(&input_ptr, (void *) (&input_length), stdin);
    if (read != -1) {
        while (*input_ptr != '\0') {
            int c = *input_ptr;
            input_ptr++;
            if (isupper(c)) {
                printf("%c", tolower(c));
            } else {
                printf("%c", toupper(c));
            }
        }
    } else {
        puts("Something Wrong Happened ...");
    }
    return 0;
}

Это говорит об ошибке сегментации после того, как я ввел свою строку.
Могу ли я знать, что случилось?Заранее спасибо.

1 Ответ

4 голосов
/ 23 сентября 2019

Вы не инициализировали input_ptr, поэтому код имеет неопределенное поведение.Возможно, вы передали неверный адрес буфера getline.Вам также следует инициализировать input_length, поэтому

char *input_ptr = NULL;
size_t input_length = 0;

Функция getline() ожидает либо указатель на выделенную вами память, либо NULL, чтобы указать, что функция должна выделитьпамять.

Если для *lineptr установлено значение NULL, а для * *n установлено значение 0 перед вызовом, то getline() выделит буфер для хранения строки.Этот буфер должен быть освобожден пользовательской программой, даже если getline() не удался.

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

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