1

Тема: Бібліотека iostream та fgets

Намагаюся підключити #include <iostream>, але отримую повідомлення "fatal error: 'iostream.h' file not found".
Використовую Ubuntu Xenial + clang. Всі бібліотеки необхідні встановлено, також gcc маю встановлений.
Не розумію чому clang не бачить її.

Щодо fgets. Зберігаю другий аргумент(ключ до шифру Венежера) до змінної key, але опісля використання вводу тексту для кодування через fgets змінна key переписується. Від неї лишається лише перша літера. Що з цим робити?

Ось  шматок коду:

[code=C++]char key[] = {0};
strcpy(key, argv[1]);
if (is_string(key) == 0)
{
    printf("Error.\n");
    return 1;
}
printf("Enter a text: \n");
fgets(to_crypt, 100, stdin);
vigenere_crypt(to_crypt, key);[/code]

2

Re: Бібліотека iostream та fgets

gcc - C
g++ - C++
Покажіть як білдите.
І ви впевнені що проблема в fgets? Покажіть функцію vigenere_crypt

Подякували: leofun011

3

Re: Бібліотека iostream та fgets

Що саме показати?
Так, впевнений. Я через printf перевіряв вміст key. До використання fgets все добре з ним.
Функція ще недописана повністю:

char vigenere_crypt(char *input, char *key)
{
    for(int i = 0, n = strlen(input); i < n; i++)
    //for(int j = 0, m = strlen(key); j < m; j++)
    {
        if (isalpha(input[i]) && (int)input[i] <= 90 && (int)input[i] >= 65)
        {
            input[i] = key[i];
        }
    }
    // printf("%s\n", input);

    return 0;
}

4

Re: Бібліотека iostream та fgets

Vitaliy_Danmer написав:

Щодо fgets. Зберігаю другий аргумент(ключ до шифру Венежера) до змінної key, але опісля використання вводу тексту для кодування через fgets змінна key переписується. Від неї лишається лише перша літера. Що з цим робити?

Ось  шматок коду:

[code=C]char key[] = {0};
...
[/code]

тут ніяких проблем з fgets немає. У вас розмір вашого key який? Як ви вважаєте? Там знаходиться тільки те, що туди влізло. З вашого дозволу - заберу ваш код для того щоб показувати на співбесидах )))

Подякували: Teg Miles, leofun01, LoganRoss3

5

Re: Бібліотека iostream та fgets

Дійсно:). Намагався впихнути невпихуєме:)

6

Re: Бібліотека iostream та fgets

Vitaliy_Danmer написав:

Дійсно:). Намагався впихнути невпихуєме:)

вам треба або виділяти пам'ять в залежності від того, якого розміру ваш ключ, який передали (якій ло речі зручніше читати з файлу). Або - що краще та надійніше - користуватися сучасним C++ (std::string, std::shared_ptr, etc).
наприклад:

void show_help()
{
  std::cout<< "My Program (c)2018" << std::endl;
  std::cout << "Example of using"<< std::endl;
  std::cout << "my_program <key> - where <key> is ..." << std::endl;
  std::cout << "for show this help again - print my_program --help" << std::endl;
}

...

std::string key(argv[1]);
if (!key.size())
{
 std::cout << "You need to set key as param. Please try again" << std::endl;
 show_help(); 
}
else if (key.find("--help") !=std::string::npos)
{
 show_help();
}
Подякували: Teg Miles1

7

Re: Бібліотека iostream та fgets

LoganRoss написав:

gcc - C
g++ - C++

gcc - GNU compiler collection, підтримує C, C++, Objective-C, Fortran, Ada та Go, а також з додатковими пакетами ще купу мов; безпосередньо команда gcc за замовчанням спробує відгадати мову і не підключить бібліотек для C++, але з парою параметрів gcc працює точно так само, як і g++ - компілятор с++ з gcc.

Подякували: Teg Miles1

8

Re: Бібліотека iostream та fgets

koala написав:
LoganRoss написав:

gcc - C
g++ - C++

gcc - GNU compiler collection, підтримує C, C++, Objective-C, Fortran, Ada та Go, а також з додатковими пакетами ще купу мов; безпосередньо команда gcc за замовчанням спробує відгадати мову і не підключить бібліотек для C++, але з парою параметрів gcc працює точно так само, як і g++ - компілятор с++ з gcc.

У мене обидва стоять і g++, i gcc.

9

Re: Бібліотека iostream та fgets

varkon написав:
Vitaliy_Danmer написав:

Дійсно:). Намагався впихнути невпихуєме:)

вам треба або виділяти пам'ять в залежності від того, якого розміру ваш ключ, який передали (якій ло речі зручніше читати з файлу). Або - що краще та надійніше - користуватися сучасним C++ (std::string, std::shared_ptr, etc).

Зрозуміло. Це я виконую завдання з гарвардського курсу CS50, переклад якого я побачив на "Прометеї".
Там є певні умови щодо вводу ключів для шифрування, тому код під них написано.

Подякували: varkon1

10

Re: Бібліотека iostream та fgets

Vitaliy_Danmer написав:

Зрозуміло. Це я виконую завдання з гарвардського курсу CS50, переклад якого я побачив на "Прометеї".
Там є певні умови щодо вводу ключів для шифрування, тому код під них написано.

до речі, ви першу вашу проблему вирішили?

11

Re: Бібліотека iostream та fgets

Ні, але я поки що цієї бібліотеки не використовую.

12 Востаннє редагувалося HetmanNet (15.08.2018 22:29:48)

Re: Бібліотека iostream та fgets

Vitaliy_Danmer написав:
varkon написав:
Vitaliy_Danmer написав:

Дійсно:). Намагався впихнути невпихуєме:)

вам треба або виділяти пам'ять в залежності від того, якого розміру ваш ключ, який передали (якій ло речі зручніше читати з файлу). Або - що краще та надійніше - користуватися сучасним C++ (std::string, std::shared_ptr, etc).

Зрозуміло. Це я виконую завдання з гарвардського курсу CS50, переклад якого я побачив на "Прометеї".
Там є певні умови щодо вводу ключів для шифрування, тому код під них написано.

Тоді iostream вам не можна, бо завдання яке ви виконуєте має бути зроблене на С, а бібліотека iostream є С++.
До речі, якщо пам'ять не підводить в CS50 є довідка по бібліотекам С і там є всі що необхідні бібліотеки для виконання всіх завдань і навіть більше.

Подякували: Teg Miles, leofun01, varkon3

13 Востаннє редагувалося ReAl (18.08.2018 23:04:54)

Re: Бібліотека iostream та fgets

Там у перших завданнях можна (і треба, щоб зосередитися на цих завданнях, а не на вводі-виводі) використовувати їхню бібліотечку (#include <cs50.h>) з GetString, GetInt і так далі (get_string у нових версіях).

І виводити часто треба строго так, як в поясненні до завдання, інакше воно автоматизовану перевірку не проходить. В дусі (може саме це завдання пройде і інакше, але в деяких дуже перебірливе)

    printf("plaintext: ");
    string s = GetString();
    // реалізація завдання
    printf("ciphertext: %s\n", s);

До речі, там є неточності різного рівня противності в оригінальних відео лекцій і відео/слайдах пояснень до домашок.
Від множення на sizeof(char) «хтозна на якій машині працюватимемо, char може бути не один байт» до

    strncpy(c, bar, strlen(bar));
Подякували: Teg Miles1

14

Re: Бібліотека iostream та fgets

ReAl написав:

Там у перших завданнях можна (і треба, щоб зосередитися на цих завданнях, а не на вводі-виводі) використовувати їхню бібліотечку (#include <cs50.h>) з GetString, GetInt і так далі (get_string у нових версіях).

Я це розумію, але виконую їхні завдання без цієї бібліотеки. Такі бібліотеки - це ведмежа послуга, як на мене.

15

Re: Бібліотека iostream та fgets

Важко сказати. Враховуючи те, на кого розрахований курс, з перших лекцій кидати людей у чисто С-шні заморочки теж не дуже добре.