Форум программистов, компьютерный форум CyberForum.ru

goto проходит несколько раз - C++

Восстановить пароль Регистрация
 
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
26.05.2012, 00:10     goto проходит несколько раз #1
Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    char pwd[16];
pwd:
    printf("> ");
    getline(pwd,15);
    if(strstr(pwd,"1234567")) 
        {if(pwd[7]!=ch-1+'0') {printf("error: invalid password\n");goto pwd;}}
    else  {printf("error: invalid password\n");goto pwd;}
/*остальной код*/
}
getline:
C++
1
2
3
4
5
6
7
8
9
int getline(char s[],int lim)
{
    int c;
    int i=0;
    for(; i<lim-1 && (c=getchar()) != '\n'; i++)
            s[i]=c;
    s[i]='\0';
    return(i);
}
Если в поле ввести строку больше 15 символов, вылезает 2 строки error: invalid password, если еще несколько, вылезет 3 строки. с cin.getline и scanf они вообще зацикливаются
Где ошибка?

P.S не стоит открывать америку говоря что это говнокод, я ведь учусь
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
26.05.2012, 00:15     goto проходит несколько раз #2
Цитата Сообщение от h3mbr0 Посмотреть сообщение
я ведь учусь
учитесь лучше сразу правильно)

Добавлено через 2 минуты
это весь код?
где объявление и инициализация ch?
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
26.05.2012, 00:15  [ТС]     goto проходит несколько раз #3
нет не весь
C++
1
2
    srand(time(NULL));
    int ch=rand() % 9+1;
но разве это имеет значение?
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
26.05.2012, 00:26     goto проходит несколько раз #4
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Где ошибка?
что сразу бросается в глаза так это goto pwd; и char pwd[16] это не хорошо. Не стоит испытывать компилятор, дай разные имена.
больше 15 символов... Где ошибка? Дело в потоке. Дело в том что ты оградил свой массив от переполнения, но лишние символы ни куда не делись они остались в потоке, следовательно будут пытаться куда нибудь записаться если их не удалить. добавь строку в getline после s[i]='\0'; (я не знаю как это будет на С но на С++ так) cin.ignore(100,'\n'); эта строка говорит что нужно извлечь лишние символы из входного потока вплоть до 100 символов и ограничителя '\n' который тоже будет извлечен!
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
26.05.2012, 00:43  [ТС]     goto проходит несколько раз #5
goto pwd; и char pwd[16]
я и по другому пробывал, но так мне больше нравиться) в 3 буквы больше ничего характиризующего не придумать, да и недумаю я что компилятор обидется, если уж он с перегрузкой функций справляется) но спасибо за совет
cin.ignore(100,'\n');
незнал о ней! действительно работает, спасибо.
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
26.05.2012, 00:57     goto проходит несколько раз #6
почему ограничение в 3 буквы? Оо
и это... не надо goto. вообще.
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
26.05.2012, 01:04  [ТС]     goto проходит несколько раз #7
почему ограничение в 3 буквы? Оо
и это... не надо goto. вообще.
где ограничение? я имел ввиду что бы код не сдвигать, почему не надо goto?
через while конечно можно, но помоему не принципиально)
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
26.05.2012, 01:43     goto проходит несколько раз #8
Цитата Сообщение от h3mbr0 Посмотреть сообщение
почему не надо goto?
Использование Goto в программе считается дурным тоном , поэтому он есть его можно использовать , но не желательно , тем более найдётся миллион способов заменить goto на , что нибудь ещё .
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
26.05.2012, 03:02     goto проходит несколько раз #9
Использование goto приводит к нарушению иерархичного порядка, при большом объеме кода становится почти невозможно проследить алгоритм выполнения программы. Код становится "лапшичным". Доказано, что абсолютно любую программу можно написать без этого goto.
Учитесь писать сразу хорошо, потом миллион раз спасибо скажете. И почему использованы потоки, а вывод с С?

Не по теме:

А в серьезных кампаниях программисты за это вобще пробивают вертушкой в щи.



Добавлено через 1 минуту
а getlin-ом называть функции - а-я-яй

Добавлено через 4 минут
Я так понял авторы надо что-то типа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cstring>
 
int main()
{
    char *pwd = "12345", mystring[20];
    do
    {
        std::cin.getline(mystring, 20);
        if (strcmp (pwd, mystring) != 0)
            std::cout<< "Invalid password. Try again.\n";
    } while (strcmp (pwd, mystring) != 0);
    std::cout<< "You're a hacker!";
    return 0;
}
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
26.05.2012, 11:44  [ТС]     goto проходит несколько раз #10
Использование goto приводит к нарушению иерархичного порядка, при большом объеме кода становится почти невозможно проследить алгоритм выполнения программы.Код становится "лапшичным". Доказано, что абсолютно любую программу можно написать без этого goto.
Читал об этом, но ведь код маленький хотя пожалуй перепишу-ка на while)
И почему использованы потоки, а вывод с С?
кто то мне говорил что cout пользоваться не хорошо... это не правда?
а getlin-ом называть функции - а-я-яй
из книжки функция
Я так понял авторы надо что-то типа:
Да, именно что-то типа этого, спасибо)

Добавлено через 3 минуты
Всегда считал..то есть как считал - просто пользовался незадумываясь, но иногда промелькала мысль, что printf и scanf те же потоки, только форматированные. Разве это не так?
Bers
Заблокирован
26.05.2012, 13:05     goto проходит несколько раз #11
Цитата Сообщение от h3mbr0 Посмотреть сообщение
кто то мне говорил что cout пользоваться не хорошо... это не правда?
Это все лживая пропаганда сишных эльфов! Тебя подло обманули.

Цитата Сообщение от h3mbr0 Посмотреть сообщение
Всегда считал..то есть как считал - просто пользовался незадумываясь, но иногда промелькала мысль, что printf и scanf те же потоки, только форматированные. Разве это не так?
Это функции. Причем элипсы (из-за чего бывают дрязги. Но дрязги в си бывают всегда).
Которые связываются с системными потоками ввода-вывода.
Системный поток ввода-вывода - это файл. Ты что-то записываешь в файл, и что-то читаешь из файла.

Если покопаться в исходниках, то тот же самый printf под виндовс толкает WriteFile из WINAPI.
Если покопаться в исходниках, то std::cout под виндовс делает тоже самое))

Таки можно утрируя считать их одними и теми же яйцами, только с разных боков.
У std::cout выше уровень безопасности, и поболее use_case. Например, его очень просто можно перепрограммировать, что бы он писал не в консоль, а куда нибудь ещё. Например - в стринговую переменную. Ну и ли вообще, вместо записи делал что-то совсем другое.

Перепрограммировать printf нельзя. Но можно перехватить потоки ввода-вывода, или подменить саму WriteFile, что бы изменить логику работы printf. Оба эти способа требуют более высокий уровень квалификации от программиста, и танцев с бубнами, в отличие от std::cout, в архитектуру которого изначально заложены удобные методики для программистов-пользователей.

А если тебе просто нужно что-то тупо вывести в консоль - забей и не парься. Пользуйся тем, что удобнее.

Добавлено через 5 минут
Цитата Сообщение от MrGluck Посмотреть сообщение
char *pwd = "12345",
Кто-то пишет goto там, где это только ухудшает понимание.
А кто-то присваивает не_константным указателям значение констант.
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
26.05.2012, 13:26  [ТС]     goto проходит несколько раз #12
спасибо, разобрался) вот еще вычитал что в boost'e есть аналог printf только более защищенный и дружащий с потоками, не подскажите что это?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2012, 13:45     goto проходит несколько раз
Еще ссылки по теме:

C++ Поскажите как правильно повторять программу несколько раз
Определить, какие цифры встречаются в числе несколько раз C++
C++ Как записать команду в консоль windows несколько раз?

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

Или воспользуйтесь поиском по форуму:
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.05.2012, 13:45     goto проходит несколько раз #13
Цитата Сообщение от h3mbr0 Посмотреть сообщение
спасибо, разобрался) вот еще вычитал что в boost'e есть аналог printf только более защищенный и дружащий с потоками, не подскажите что это?
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
#include <boost/format.hpp>
 
int main()
{
    int a = 5;
    short b = 3;
    std::string str = "8";
    
    std::cout << boost::format("%1% + %2% == %3%") % a % b % str;
}
Yandex
Объявления
26.05.2012, 13:45     goto проходит несколько раз
Ответ Создать тему
Опции темы

Текущее время: 07:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru