Разные output при различных ключах компиляции - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Почему если компилировать программу командой:
sudo gcc main.c -o main -Wall
То output выглядит так:
From: admin
Subject: hi
А если компилировать командой :
sudo gcc main.c -o main -g -O2 -Wall -Werror -std=c99
То output :
From: admin
Subject: hi
(null)
Почему так? Условие задачи:
Чтобы показать информацию о пришедшем письме, нужно сначала её найти. Для этого в файле письма необходимо найти специальные заголовки. Составить программу построчной фильтрации текста. Суть фильтра — отбор строк, начинающихся с одного из следующих выражений: «Date:», «From:»,«To:», «Subject:». Текстовые строки подаются на стандартный ввод программы, результат программы должен подаваться на стандартный вывод. Процедура фильтрации должна быть оформлена в виде отдельной функции, которой подается на вход массив строк, выделенных в динамической памяти и его длина. На выходе функция возвращает указатель на NULL-терминированный массив с найденными строками (последним элементом массива добавлен NULL для обозначения, что данных больше нет). Программа должна уметь обрабатывать возникающие ошибки (например, ошибки выделения памяти). В случае возникновения ошибки нужно вывести в поток стандартного вывода сообщение "[error]" и завершить выполнение программы.
Код программы:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#define MAX_SIZE 1024
 
char* filtration(char *str, int len);
 
int main()
{
    char **str;
    int res;
    int i, j;
    int len, count = 0;
    int flag = 0;
    char *string;
    if((str = (char **)malloc(MAX_SIZE * sizeof(char *))) == NULL) {
        printf("[error]");
    }
    for(i = 0; i < MAX_SIZE; ++i) {
        str[i] = (char *)malloc(MAX_SIZE * sizeof(char));
    }
    for(i = 0; i < MAX_SIZE; ++i) {
        for(j = 0; j < MAX_SIZE; ++j) {
            res = scanf("%c", &str[i][j]);
            if(res == 0) {
                printf("[error]");
                return 111;
            }
            if(res == EOF) {
                flag = 1;
                break;
            }
            if(str[i][j] == '\n') {
                str[i][j] = '\0';
                break;
            }
            if(str[MAX_SIZE - 1][MAX_SIZE - 1] != '\0') {
                printf("[error]");
                return 111;
            }
            //if(res == EOF) break;
        }
        if(flag) break;
        ++count;
    }
    /*for(i = 0;i < 1; ++i) {
        for(j = 0; j < MAX_SIZE; ++j) {
            printf("%c", str[i][j]);
        }
    }*/
    for(i = 0; i < count; ++i) {
        len = strlen(str[i]);
        //printf("%d", len);
        string = filtration(str[i], len);
        //if(string == NULL) {
        //    printf("[error]");
        //    return 111;
        //}
        printf("%s\n", string);
    }
    return 0;
}
 
char* filtration(char *str, int len) {
    //int count = 4;//Количество ключей
    char *fstr = NULL;
    /*const char key[] = {
        "To:",
        "Subject:",
        "From:",
        "Date:",
    };*/
    const char *key1 = "To:";
    const char *key2 = "Subject";
    const char *key3 = "From:";
    const char *key4 = "Date:";
    //int i = 0; int j = 0;
    //for(i = 0; i < count; ++i) {
    //    fstr = strstr(str, key[i]);
    //}
    if(str[0] == key1[0]) {
        fstr = strstr(str, key1);
    }
    else if(str[0] == key2[0]) {
        fstr = strstr(str, key2);
    }
    else if(str[0] == key3[0]) {
        fstr = strstr(str, key3);
    }
    else if(str[0] == key4[0]) {
        fstr = strstr(str, key4);
    }
    return fstr;
}
Input:
From: admin
Subject: hi
Sender: admin
И если есть идеи как программу исправить и написать её

наиболее правильно

(а я уверен что так можно) поделитесь пожалуйста.
При прохождении теста в системе тестирования пишет ошибку Run-time error. Вот что выводит команда echo -n "1" | valgrind ./main
maxim@maxim:~/techpark/cpp/IZ/1++$ echo -n "1" | valgrind ./main
==7163== Memcheck, a memory error detector
==7163== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==7163== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==7163== Command: ./main
==7163== 
==7163== Conditional jump or move depends on uninitialised value(s)
==7163==    at 0x4005C8: main (main.c:38)
==7163== 
==7163== 
==7163== HEAP SUMMARY:
==7163==     in use at exit: 1,056,768 bytes in 1,025 blocks
==7163==   total heap usage: 1,025 allocs, 0 frees, 1,056,768 bytes allocated
==7163== 
==7163== LEAK SUMMARY:
==7163==    definitely lost: 8,192 bytes in 1 blocks
==7163==    indirectly lost: 1,048,576 bytes in 1,024 blocks
==7163==      possibly lost: 0 bytes in 0 blocks
==7163==    still reachable: 0 bytes in 0 blocks
==7163==         suppressed: 0 bytes in 0 blocks
==7163== Rerun with --leak-check=full to see details of leaked memory
==7163== 
==7163== For counts of detected and suppressed errors, rerun with: -v
==7163== Use --track-origins=yes to see where uninitialised values come from
==7163== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
UPD: Забыл освободить память. Освободил. Теперь команда echo -n "1" | valgrind ./main выводит следующее:
maxim@maxim:~/techpark/cpp/IZ/1++$ echo -n "1" | valgrind ./a.out
==7293== Memcheck, a memory error detector
==7293== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==7293== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==7293== Command: ./a.out
==7293== 
==7293== Conditional jump or move depends on uninitialised value(s)
==7293==    at 0x40085F: main (in /home/maxim/techpark/cpp/IZ/1++/a.out)
==7293== 
==7293== 
==7293== HEAP SUMMARY:
==7293==     in use at exit: 0 bytes in 0 blocks
==7293==   total heap usage: 1,025 allocs, 1,025 frees, 1,056,768 bytes allocated
==7293== 
==7293== All heap blocks were freed -- no leaks are possible
==7293== 
==7293== For counts of detected and suppressed errors, rerun with: -v
==7293== Use --track-origins=yes to see where uninitialised values come from
==7293== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

Решение задачи: «Разные output при различных ключах компиляции»

textual
Листинг программы
string = filtration(str[i], len);
printf("%s\n", string);

Объяснение кода листинга программы

  1. Входные данные:
    • str[i] - строка, содержащая некоторые символы
    • len - длина строки
  2. Выполняется функция filtration, которая принимает два аргумента: str и len.
    • filtration - это функция, которая фильтрует строку str, удаляя все символы, кроме букв и цифр.
    • Результатом работы функции filtration является отфильтрованная строка.
  3. Результат функции filtration сохраняется в переменной string.
  4. Выводится значение переменной string с помощью функции printf.
    • Форматирование вывода: %s - указывает на то, что нужно вывести строку.
    • Передача символа '\n' после строки в форматировании позволяет переходить на новую строку.
  5. Выполнение повторяется для каждого элемента массива str[i] и каждой длины len.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы