Ошибка сегментации Ubuntu C

Я получаю ошибку сегментации, когда хочу запустить эту программу. Предполагается, что это самописная функция grep, но без учета регистра. Тот же код для учета регистра работает просто отлично, поэтому он может иметь какое-то отношение к tolower()?. Пожалуйста помоги. Использовался код VS в Ubuntu на ПК с Windows.

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


int main (int argc, char *argv[]) {
    if (argc > 3) {
        printf("Too many arguments. Only use 2: your search string and the file name.");
        return -1;
    }

    //FILE * fp;
    FILE * fp = fopen(argv[2], "r");
    if (fp == NULL) {
           perror("Unable to open file!");
           return -1;
       }
    char * buffer = NULL;
    size_t bufsize = 0;
    char * lowerBuffer = malloc(sizeof(strlen(buffer)));

    for (int i = 0; buffer[i] != '\0'; i++) {
        lowerBuffer[i] = tolower(buffer[i]);
    }
    
    printf("tolower: %s", lowerBuffer);

    while (getline(&buffer, &bufsize, fp) != -1) {
        if (strstr(buffer, argv[1]))
        {
            printf("%s", buffer);
        }
                
        //printf("%zd", strlen(buffer));
    }
    
    fclose(fp);
    free(buffer);

    //getline();

    return 0;
}

Скомпилировано с gcc mygrepin.c, запускается с ./a.out test test.txt. Вот как выглядит мой test.txt: привет дас ист эйн тест.
тест
тест
тест
тест
тест

Я ожидаю этот вывод для этой команды ./a.out test test.txt:
привет дас ист эйн тест.
тест
тест
тест
тест
тест

malloc(sizeof(strlen(buffer))) что это?
Sourav Ghosh 16.02.2023 14:34

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

learning 16.02.2023 14:36

Пожалуйста, перечитайте это, затем попробуйте оценить это с помощью ручки и бумаги, и вы получите ответ.

Sourav Ghosh 16.02.2023 14:38

Вся логика программы неверна, вы пытаетесь преобразовать текст в нижний регистр, прежде чем читать этот текст...

Jabberwocky 16.02.2023 14:46

Лучше используйте grep -i.

nielsen 16.02.2023 14:48

@Jabberwocky спасибо, это помогло. Тут немного запутался.

learning 16.02.2023 14:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пытаетесь использовать

malloc(sizeof(strlen(buffer)))

на объекте, который вы только что определили как Null

char * buffer = NULL;

Malloc используется для выделения пространства. Что вы хотите сделать, так это выделить место для размера строки с длиной вашего буфера переменных. Буфер нулевой.

Обновлено: как указано в комментарии, не выделяется место. Это либо 4, либо 8 в зависимости от вашей машины. Работает на тип. Указатель должен возвращать значение 4 или 8 в зависимости от вашей архитектуры системы. Спасибо @mch за указание на это. Несмотря на то, что это так, проблема все еще остается и была вызвана тем, что для буфера никогда не устанавливалось значение, отличное от NULL.

Пожалуйста, уточните, какая часть является проблематичной.

Sourav Ghosh 16.02.2023 14:37

Это лучше? @SouravGhosh Логика здесь довольно ошибочна. Я думал, он понял это, перечитав эти две строчки.

SickerDude43 16.02.2023 14:42

Да, я понял, в чем проблема, по этим двум строчкам, так что спасибо! Я просто не могу найти решение сейчас :) Кстати, женщина здесь!

learning 16.02.2023 14:48

Никаких проблем и удачи вам в будущих проектах

SickerDude43 16.02.2023 15:01
What you want to do is to allocate space for the size of a string with the length of your variable buffer. Buffer is null. So no space is allocated. неправда. sizeof оценивается как константа времени компиляции и работает с типом. strlen(buffer) будет (будет, потому что это не вызывается в этом контексте) вернет size_t, так что это просто sizeof(size_t), который на обычных машинах 4 или 8.
mch 16.02.2023 15:42

@mch Спасибо. Я проверил это, и вы правы. Отредактировал мой ответ.

SickerDude43 16.02.2023 16:09

Другие вопросы по теме