Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
44 / 30 / 18
Регистрация: 15.11.2014
Сообщений: 169
1

Разные output при различных ключах компиляции

18.03.2015, 17:00. Показов 668. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Почему если компилировать программу командой:
Код
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]" и завершить выполнение программы.


Код программы:

Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#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
И если есть идеи как программу исправить и написать её наиболее правильно(а я уверен что так можно) поделитесь пожалуйста.

Добавлено через 10 минут
При прохождении теста в системе тестирования пишет ошибку 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)


Добавлено через 12 минут
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)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2015, 17:00
Ответы с готовыми решениями:

Ошибка "Could not create output file" при компиляции проекта
Пытаюсь компилировать программу Ошибка: synafpc.pas(150): F2039 Could not create output file...

Ошибка "Could not create output file" при компиляции проекта
Здравствуйте, у меня при компиляции приложения в rad studio xe 7, когда делаю отчет как на вашем...

Разные возвращаемые значения при компиляции и отладки
Всем привет. Пишу очередную лабу по моделям, и возникла трудность, что при компиляции массив...

Разные эффекты при компиляции Debug и Release
Вывожу графику на экран точнее пнг рисунок но в при компиляции и старте на экране разный эффект...

1
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
19.03.2015, 08:41 2
Цитата Сообщение от Zedapp Посмотреть сообщение
Почему так?
Объясняю. Строки 55+60:
C
1
2
string = filtration(str[i], len);
printf("%s\n", string);
Ваша функция filtration организована так, чтобы в некоторых случаях возвращать нулевой указатель. В свою очередь, передача нулевого указателя в функцию printf дает неопределенное поведение, что судя по всему и имеет место в вашем случае. Плюс ко всему, лично у меня не работает даже ваш ввод с клавиатуры, выкидывая в этой строке:
C
1
if(str[MAX_SIZE - 1][MAX_SIZE - 1] != '\0')
Так что тут имеет место или архитектурный, или логический косяк. Смотря с какой стороны смотреть.
1
19.03.2015, 08:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2015, 08:41
Помогаю со студенческими работами здесь

Ошибка при компиляции "cannot open output file 780561.exe: Permission denied"
Сделал пару правок и код перестал работать, вернул все назад и снова ничего. Ошибка: ...

Выводы при одинаковых ключах массива
на вход приходят 2 массива, вида первый массив вида array(0=&gt;строка,1=&gt;строка, 2=&gt;строка) ...

Переписать текст в файл output.dat , удалив из текста слова, содержащие более двух различных гласных букв
Помогите решить пожалуйста) Файл Input.dat содержит несколько строк текста. Слова в тексте...

Ошибка компиляции "cannot open output file GO.exe: Permission denied"
Подскажите в чем ошибка? Почему не хочет компилировать? 17:30:58 **** Incremental Build of...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru