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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 127
#1

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

26.05.2012, 00:10. Просмотров 599. Ответов 12
Метки нет (Все метки)

Есть код:
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 не стоит открывать америку говоря что это говнокод, я ведь учусь
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2012, 00:10     goto проходит несколько раз
Посмотрите здесь:

C++ Вывести числа, которые встречаются в массиве несколько раз / один раз
C++ Как вывести на экран несколько раз
C++ В цикле почему-то проходит по условию только один раз
C++ Повернуть треугольник на 90 градусов несколько раз
Можно ли несколько раз делитить область памяти? C++
C++ Поскажите как правильно повторять программу несколько раз
C++ Как через goto вернуться назад, чтоб еще раз проверить функцию?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Сообщений: 127
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
Сообщений: 127
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
Сообщений: 127
26.05.2012, 01:04  [ТС]     goto проходит несколько раз #7
почему ограничение в 3 буквы? Оо
и это... не надо goto. вообще.
где ограничение? я имел ввиду что бы код не сдвигать, почему не надо goto?
через while конечно можно, но помоему не принципиально)
Игорь с++
 Аватар для Игорь с++
432 / 455 / 16
Регистрация: 26.01.2011
Сообщений: 2,031
26.05.2012, 01:43     goto проходит несколько раз #8
Цитата Сообщение от h3mbr0 Посмотреть сообщение
почему не надо goto?
Использование Goto в программе считается дурным тоном , поэтому он есть его можно использовать , но не желательно , тем более найдётся миллион способов заменить goto на , что нибудь ещё .
MrGluck
Ворчун
Эксперт CЭксперт С++
 Аватар для MrGluck
6191 / 3443 / 421
Регистрация: 29.11.2010
Сообщений: 9,122
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
Сообщений: 127
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
Сообщений: 127
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++ Как записать команду в консоль windows несколько раз?
Увеличение чисел в несколько раз C++
Повторить строку вектора несколько раз C++
Увеличение переменной раз в несколько итераций C++

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

Или воспользуйтесь поиском по форуму:
diagon
Higher
 Аватар для diagon
1921 / 1187 / 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 проходит несколько раз
Ответ Создать тему
Опции темы

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