Разные 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.