Разные output при различных ключах компиляции - C (СИ)
Формулировка задачи:
Доброго времени суток! Почему если компилировать программу командой:
То output выглядит так:
А если компилировать командой :
То output :
Почему так?
Условие задачи:
Код программы:
Input:
И если есть идеи как программу исправить и написать её
sudo gcc main.c -o main -Wall
From: admin Subject: hi
sudo gcc main.c -o main -g -O2 -Wall -Werror -std=c99
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; }
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);
Объяснение кода листинга программы
- Входные данные:
- str[i] - строка, содержащая некоторые символы
- len - длина строки
- Выполняется функция filtration, которая принимает два аргумента: str и len.
- filtration - это функция, которая фильтрует строку str, удаляя все символы, кроме букв и цифр.
- Результатом работы функции filtration является отфильтрованная строка.
- Результат функции filtration сохраняется в переменной string.
- Выводится значение переменной string с помощью функции printf.
- Форматирование вывода: %s - указывает на то, что нужно вывести строку.
- Передача символа '\n' после строки в форматировании позволяет переходить на новую строку.
- Выполнение повторяется для каждого элемента массива str[i] и каждой длины len.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д