Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
MasterYoda
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 28
1

Программирование на С. двойной запрос ввода

19.11.2016, 22:42. Просмотров 905. Ответов 17
Метки нет (Все метки)

Здравствуйте!
Когда нужно ввести значение N, если ввести какую-то букву, то программа виснет. Нужно поставить ограничение на ввод исключительно чисел (что бы буквы вводить было нельзя)
Нашла в сети такой нехитрый способ и у себя на сроке 27 применил его.
проблема решилась- если ввести букву, то выползает предупреждение как и полагается, НО если вводишь число, то что бы программа сработала его нужно ввести два раза.
Раньше, (до этого способа запрета на буквы) Нужно что бы после ввода числа, нажал интер, и программа сразу отработала, а теперь приходится ввести число, нажать интер, после чего тебя перебрасывает на новую строку, потом еще раз ввести число, нажать интер и только после этого она отработает.

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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
 
int main()
{
        int i = 0;
        int j = 0;
        int N = 0;
        unsigned int mass[21];
 
        printf("Vvedite znachenie massiva ot 8 do 20: ");
        scanf_s("%d",&i);
        printf("\n");
 
        if ((i < 8) || (i>20)){
                printf("Error! razmernost zadana neverno!\n");
                printf("Press any key to exit");
                _getch();
                exit(0);
        }
        printf("Vvedite chislo N: ");
        scanf_s("%d", &N);
        printf("\n");
 
        if (scanf_s("%d", &N) != 1){
                printf("Error! razmernost zadana nevernooo!\n");
                printf("Press any key to exit");
                _getch();
                exit(0);
        }
        else{
 
                for (j = 0; j <= i; j++){
                        mass[j] = rand() % N;
                }
        }
 
        for (j = 0; j <= i; j++){
                printf("mass[ %d", j);
                printf("]= %d", mass[j]);
                printf("\n");
        }
        printf("Press any key to exit");
        _getch();
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2016, 22:42
Ответы с готовыми решениями:

Повторный запрос ввода при ошибке
При вводе не верного числа все норм, при вводе символа - выводится &quot;Вы...

двойной запрос
есть форма которая отправлять POST запросом данные. вот так выглядит запрос...

Двойной запрос
Здравствуйте. Подскажите, пожалуйста как сделать запрос к &quot;самому себе&quot;. Есть...

Двойной ajax запрос
Имеется аякс скрипт, к примеру это будет форма для добавления комментария. ...

Двойной запрос на поиск
Как сделать двойной запрос на поиск? SELECT * FROM TABLE WHERE Atrib1 LIKE...

17
nmcf
6521 / 5748 / 2618
Регистрация: 14.04.2014
Сообщений: 24,493
19.11.2016, 23:22 2
Ну так зачем ты 2 раза функцию вызываешь?
C++
1
2
3
4
5
6
7
        printf("Vvedite chislo N: ");
        if (scanf_s("%d", &N) != 1){
                printf("Error! razmernost zadana nevernooo!\n");
                printf("Press any key to exit");
                _getch();
                exit(0);
        }
0
matveev1512
21 / 21 / 14
Регистрация: 29.05.2016
Сообщений: 119
Завершенные тесты: 1
19.11.2016, 23:30 3
C
1
unsigned int mass[21];
Хм. Вот оно как.

Добавлено через 2 минуты
Как вариант можно читать значения как char и потом применить функцию atoi
https://ru.wikipedia.org/wiki/Atoi
0
MasterYoda
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 28
20.11.2016, 07:33  [ТС] 4
Пробовал ее полностью убрать, но проблема не решилась- все так же нужно два раза вводить переменную N
0
shvyrevvg
578 / 538 / 270
Регистрация: 12.05.2016
Сообщений: 1,563
20.11.2016, 09:29 5
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
int getint(const char* msg)
{
    int value = 0;
    while ( printf(msg) && scanf_s("%d",&value) != 1) {
        fprintf(stderr, "Vvedite chislo!\n");
        fflush(stdin);
    }
    return value;
}
int main(void)
{
    int i = 0;
    int j = 0;
    int N = 0;
    unsigned int mass[21];
 
    while (1) {
        i = getint("Vvedite znachenie massiva ot 8 do 20: ");
        if (i>8 && i<20) break;
        fprintf(stderr, "Error! razmernost zadana nevernooo!\n");
    }
    
    N = getint("Vvedite chislo N: ");
    for (j = 0; j <= i; j++)
        mass[j] = rand() % N;
 
 
    for (j = 0; j <= i; j++){
        printf("mass[ %d", j);
        printf("]= %d", mass[j]);
        printf("\n");
    }
    printf("Press any key to exit");
    getchar();
}
0
matveev1512
21 / 21 / 14
Регистрация: 29.05.2016
Сообщений: 119
Завершенные тесты: 1
20.11.2016, 10:17 6
shvyrevvg, Не работает! Введите букву и посмотрите результат.
0
shvyrevvg
578 / 538 / 270
Регистрация: 12.05.2016
Сообщений: 1,563
20.11.2016, 10:32 7
Цитата Сообщение от matveev1512 Посмотреть сообщение
shvyrevvg, Не работает! Введите букву и посмотрите результат.
Вы бы хоть скрин показали

Добавлено через 8 минут
MasterYoda, если хотите заморочиться( чтобы и 34fdsf обрабатывалось), то почитайте http://www.cyberforum.ru/blogs/42536/blog278.html
0
matveev1512
21 / 21 / 14
Регистрация: 29.05.2016
Сообщений: 119
Завершенные тесты: 1
20.11.2016, 10:40 8
функция scanf возвращает true если ввод был верный и false если была ошибка
вот вам решение этой проблемы
C
1
2
3
4
int a;
            
    while (!(scanf("%d", &a)));
    printf("%d", a);
0
nmcf
6521 / 5748 / 2618
Регистрация: 14.04.2014
Сообщений: 24,493
20.11.2016, 10:51 9
matveev1512, она возвращает количество введённых полей, а не bool.
1
matveev1512
21 / 21 / 14
Регистрация: 29.05.2016
Сообщений: 119
Завершенные тесты: 1
20.11.2016, 10:53 10
точно ))) Спасибо! Не знал)) Тогда это моё решение не верно
0
nmcf
6521 / 5748 / 2618
Регистрация: 14.04.2014
Сообщений: 24,493
20.11.2016, 11:14 11
Ну в случае одного параметра, может, и верно, только надо очищать ввод.
0
MasterYoda
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 28
20.11.2016, 11:41  [ТС] 12
shvyrevvg, спасибо!
Единственное, вы практически весь код переписали. Да, по функционалу она получился даже лучше, да и ошибок с текстом нет.
Но мне бы еще хотелось узнать, возможно ли в моем коде решить проблему с вводом текста? и из-за чего приходится этот косяк с двойным вводом N?
Выше советовали функцию atoi, но как-то о ней не очень хорошо отзываются.
0
matveev1512
21 / 21 / 14
Регистрация: 29.05.2016
Сообщений: 119
Завершенные тесты: 1
20.11.2016, 12:01 13
Проверял разные варианты. В любом случае если не Число то scanf возвращает ноль . И да нужно очистить ввод, все верно!

Добавлено через 12 минут
Попробуйте вот так
C
1
2
    
            scanf_s("%*[^\n]");
Добавлено через 1 минуту
чистка ввода
0
shvyrevvg
578 / 538 / 270
Регистрация: 12.05.2016
Сообщений: 1,563
20.11.2016, 12:12 14
Лучший ответ Сообщение было отмечено MasterYoda как решение

Решение

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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
 
int main()
{
        int i = 0;
        int j = 0;
        int N = 0;
        unsigned int mass[21];
 
        printf("Vvedite znachenie massiva ot 8 do 20: ");
        if (scanf_s("%d",&i) != 1) {
                printf("Error! razmernost zadana nevernooo!\n");
                printf("Press any key to exit");
                _getch();
                exit(1);
        }
        printf("\n");
 
        if ((i < 8) || (i>20)){
                printf("Error! razmernost zadana neverno!\n");
                printf("Press any key to exit");
                _getch();
                exit(1);
        }
        printf("Vvedite chislo N: ");
        //scanf_s("%d", &N); //- лишняя строка
        //printf("\n"); - это тоже необязательно после Enter и так перевод строки будет
 
        if (scanf_s("%d", &N) != 1) { // Вы же тут вводите N 
                printf("Error! razmernost zadana nevernooo!\n");
                printf("Press any key to exit");
                _getch();
                exit(1);
        }
       // else{ //не нужен, т.к. в случае ошибки вы закрываете программу
 
                for (j = 0; j <= i; j++){
                        mass[j] = rand() % N;
                }
       // }
 
        for (j = 0; j <= i; j++){
                printf("mass[ %d", j);
                printf("]= %d", mass[j]);
                printf("\n");
        }
        printf("Press any key to exit");
        _getch();
}
Добавлено через 3 минуты
Цитата Сообщение от MasterYoda Посмотреть сообщение
и из-за чего приходится этот косяк с двойным вводом N?
Вы два раза scanf_s("%d", &N) вызываете перед ифом и в ифе.
Цитата Сообщение от MasterYoda Посмотреть сообщение
Выше советовали функцию atoi, но как-то о ней не очень хорошо отзываются.
Только не atoi, strtol можно.
1
MasterYoda
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 28
20.11.2016, 12:17  [ТС] 15
shvyrevvg, Огромное спасибо.
Я тоже как раз только что от статьи пришел, на которую вы ссылку давали. Там как раз ваш метод, который вы здесь применили, рассматривался.
0
matveev1512
21 / 21 / 14
Регистрация: 29.05.2016
Сообщений: 119
Завершенные тесты: 1
20.11.2016, 12:19 16
Лучший ответ Сообщение было отмечено MasterYoda как решение

Решение

Я думаю вот так будет то что вам нужно
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
 
int main()
{
    int i = 0, j = 0, N = 0, _check;
    int mass[20];
 
    printf("Vvedite znachenie massiva ot 8 do 20: ");
    do {
        _check = scanf_s("%d", &i);
        if (!_check) {
            printf("Error\n");
            scanf_s("%*[^\n]");
        }
    } while (!_check);
    printf("\n");
 
    if ((i < 8) || (i>20)) {
        printf("Error! razmernost zadana neverno!\n");
        printf("Press any key to exit");
        _getch();
        exit(0);
    }
    printf("Vvedite chislo N: ");
    do {
        _check = scanf_s("%d", &N);
        if (!_check) {
            printf("Error\n");
            scanf_s("%*[^\n]");
        }
 
    } while (!_check);
    printf("\n");
 
    for (j = 0; j < i; j++) {
            mass[j] = rand() % N;
        }
    
 
    for (j = 0; j < i; j++) {
        printf("mass[ %d", j);
        printf("]= %d", mass[j]);
        printf("\n");
    }
    printf("Press any key to exit");
    _getch();
}
1
shvyrevvg
578 / 538 / 270
Регистрация: 12.05.2016
Сообщений: 1,563
20.11.2016, 12:20 17
Цитата Сообщение от MasterYoda Посмотреть сообщение
Там как раз ваш метод, который вы здесь применили, рассматривался.
Ну это не мой метод, сам скомуниздил из этой статьи В статье более универсальный.
0
MasterYoda
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 28
20.11.2016, 12:35  [ТС] 18
matveev1512, спасибо! Это тоже отлично подходит.
0
20.11.2016, 12:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2016, 12:35

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

Двойной запрос в Mysql C#
Почему у меня выводит ошибку Could not find specified column in results:...

Двойной запрос в mysql
Доброго времени суток. Столкнулся с проблемой. При выполнении запроса в базу...


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

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

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