Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
h3mbr0
248 / 91 / 21
Регистрация: 12.03.2012
Сообщений: 360
#1

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

26.05.2012, 00:10. Просмотров 632. Ответов 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 не стоит открывать америку говоря что это говнокод, я ведь учусь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2012, 00:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос goto проходит несколько раз (C++):

Как через goto вернуться назад, чтоб еще раз проверить функцию? - C++
ребят,подскажите пожалуйста,как мне через goto вернуться назад,чтоб еше раз проверить мою функцию? ...

Вывести числа, которые встречаются в массиве несколько раз / один раз - C++
дан массив состоящий из 100 целых чисел. а)Вывести все числа,которие встречаются в етом массиве несколько раз б)Вывести все...

В цикле почему-то проходит по условию только один раз - C++
Задача такая: Дан одномерный массив и натуральных чисел. Удалить из него все тройки подряд идущих равных чисел, и вывести размер...

Увеличение чисел в несколько раз - C++
Здравствуйте. Сразу же извиняюсь за свой &quot;тупой&quot; вопрос, я в С++ недавно так что помогите. Как увеличить число в 2 раза. Например я ввожу...

Как вывести на экран несколько раз - C++
В задании надо чтобы целое значение (b) вводилось с клавиатуры 4 раза, соответственно потом (x) и (y) выводятся на экран после каждого...

Увеличение переменной раз в несколько итераций - C++
Как сделать так, чтобы переменная n раз в 5 итераций увеличивалась на 1? Ну и чтобы цикл 25 раз продолжался, но j максимально до 5...

12
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
26.05.2012, 00:15 #2
Цитата Сообщение от h3mbr0 Посмотреть сообщение
я ведь учусь
учитесь лучше сразу правильно)

Добавлено через 2 минуты
это весь код?
где объявление и инициализация ch?
0
h3mbr0
248 / 91 / 21
Регистрация: 12.03.2012
Сообщений: 360
26.05.2012, 00:15  [ТС] #3
нет не весь
C++
1
2
    srand(time(NULL));
    int ch=rand() % 9+1;
но разве это имеет значение?
0
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
26.05.2012, 00:26 #4
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Где ошибка?
что сразу бросается в глаза так это goto pwd; и char pwd[16] это не хорошо. Не стоит испытывать компилятор, дай разные имена.
больше 15 символов... Где ошибка? Дело в потоке. Дело в том что ты оградил свой массив от переполнения, но лишние символы ни куда не делись они остались в потоке, следовательно будут пытаться куда нибудь записаться если их не удалить. добавь строку в getline после s[i]='\0'; (я не знаю как это будет на С но на С++ так) cin.ignore(100,'\n'); эта строка говорит что нужно извлечь лишние символы из входного потока вплоть до 100 символов и ограничителя '\n' который тоже будет извлечен!
1
h3mbr0
248 / 91 / 21
Регистрация: 12.03.2012
Сообщений: 360
26.05.2012, 00:43  [ТС] #5
goto pwd; и char pwd[16]
я и по другому пробывал, но так мне больше нравиться) в 3 буквы больше ничего характиризующего не придумать, да и недумаю я что компилятор обидется, если уж он с перегрузкой функций справляется) но спасибо за совет
cin.ignore(100,'\n');
незнал о ней! действительно работает, спасибо.
0
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
26.05.2012, 00:57 #6
почему ограничение в 3 буквы? Оо
и это... не надо goto. вообще.
0
h3mbr0
248 / 91 / 21
Регистрация: 12.03.2012
Сообщений: 360
26.05.2012, 01:04  [ТС] #7
почему ограничение в 3 буквы? Оо
и это... не надо goto. вообще.
где ограничение? я имел ввиду что бы код не сдвигать, почему не надо goto?
через while конечно можно, но помоему не принципиально)
0
Игорь с++
437 / 460 / 16
Регистрация: 26.01.2011
Сообщений: 2,033
26.05.2012, 01:43 #8
Цитата Сообщение от h3mbr0 Посмотреть сообщение
почему не надо goto?
Использование Goto в программе считается дурным тоном , поэтому он есть его можно использовать , но не желательно , тем более найдётся миллион способов заменить goto на , что нибудь ещё .
0
MrGluck
Модератор
Эксперт CЭксперт С++
7497 / 4613 / 694
Регистрация: 29.11.2010
Сообщений: 12,631
26.05.2012, 03:02 #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;
}
1
h3mbr0
248 / 91 / 21
Регистрация: 12.03.2012
Сообщений: 360
26.05.2012, 11:44  [ТС] #10
Использование goto приводит к нарушению иерархичного порядка, при большом объеме кода становится почти невозможно проследить алгоритм выполнения программы.Код становится "лапшичным". Доказано, что абсолютно любую программу можно написать без этого goto.
Читал об этом, но ведь код маленький хотя пожалуй перепишу-ка на while)
И почему использованы потоки, а вывод с С?
кто то мне говорил что cout пользоваться не хорошо... это не правда?
а getlin-ом называть функции - а-я-яй
из книжки функция
Я так понял авторы надо что-то типа:
Да, именно что-то типа этого, спасибо)

Добавлено через 3 минуты
Всегда считал..то есть как считал - просто пользовался незадумываясь, но иногда промелькала мысль, что printf и scanf те же потоки, только форматированные. Разве это не так?
0
Bers
Заблокирован
26.05.2012, 13:05 #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 там, где это только ухудшает понимание.
А кто-то присваивает не_константным указателям значение констант.
1
h3mbr0
248 / 91 / 21
Регистрация: 12.03.2012
Сообщений: 360
26.05.2012, 13:26  [ТС] #12
спасибо, разобрался) вот еще вычитал что в boost'e есть аналог printf только более защищенный и дружащий с потоками, не подскажите что это?
0
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.05.2012, 13:45 #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;
}
2
26.05.2012, 13:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2012, 13:45
Привет! Вот еще темы с ответами:

Повторить строку вектора несколько раз - C++
Ну вот что со мной не так?)) #include &lt;iostream&gt; #include &lt;clocale&gt; #include &lt;ctime&gt; using namespace std; int...

Повернуть треугольник на 90 градусов несколько раз - C++
// triangle.cpp : Defines the entry point for the console application. // #include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include...

Поиск подстроки в строке, встречается несколько раз - C++
Здравствуйте, форумчане! Помогите пожалуйста доработать программу, сейчас она ищет подстроку в строке, но если подстрока встречается 2...

Можно ли несколько раз делитить область памяти? - C++
Собственно, чреват ли ошибками код: int *a; a = new int; a = 1; a = 2; delete a; delete a;


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.