Я получаю ошибку сегментации, когда хочу запустить эту программу. Предполагается, что это самописная функция 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:
привет дас ист эйн тест.
тест
тест
тест
тест
тест
Поскольку я хочу сохранить строки только с нижними буквами, мне нужно место для их сохранения, поэтому я выделил место в памяти
Пожалуйста, перечитайте это, затем попробуйте оценить это с помощью ручки и бумаги, и вы получите ответ.
Вся логика программы неверна, вы пытаетесь преобразовать текст в нижний регистр, прежде чем читать этот текст...
Лучше используйте grep -i
.
@Jabberwocky спасибо, это помогло. Тут немного запутался.
Вы пытаетесь использовать
malloc(sizeof(strlen(buffer)))
на объекте, который вы только что определили как Null
char * buffer = NULL;
Malloc используется для выделения пространства. Что вы хотите сделать, так это выделить место для размера строки с длиной вашего буфера переменных. Буфер нулевой.
Обновлено: как указано в комментарии, не выделяется место. Это либо 4, либо 8 в зависимости от вашей машины. Работает на тип. Указатель должен возвращать значение 4 или 8 в зависимости от вашей архитектуры системы. Спасибо @mch за указание на это. Несмотря на то, что это так, проблема все еще остается и была вызвана тем, что для буфера никогда не устанавливалось значение, отличное от NULL.
Пожалуйста, уточните, какая часть является проблематичной.
Это лучше? @SouravGhosh Логика здесь довольно ошибочна. Я думал, он понял это, перечитав эти две строчки.
Да, я понял, в чем проблема, по этим двум строчкам, так что спасибо! Я просто не могу найти решение сейчас :) Кстати, женщина здесь!
Никаких проблем и удачи вам в будущих проектах
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 Спасибо. Я проверил это, и вы правы. Отредактировал мой ответ.
malloc(sizeof(strlen(buffer)))
что это?