1 / 1 / 0
Регистрация: 26.12.2016
Сообщений: 51
1

Как запретить ввод слова "con" в консоли Visual Studio 2012

16.01.2017, 22:59. Показов 3872. Ответов 27

Всем добра! Написал программу для работы с символами, но есть одна проблема, что при вводе слова "con" программа ломается. Как запретить ввод слова "con" или "CON" или "CoN" в С++ на Visual Studio 2012?
Моя программа, в ней я уже добавил цикл на проверку, но он не работает:
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
// Лабораторная_№3.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <iterator>
#include <algorithm>
using namespace std;
int main() {
    setlocale(LC_ALL,"RUS");
    string name;
    cout<<"Файл:";
    cin>>name;  // abc.txt например 
    ifstream ff(name.c_str());
    goto ABC;
    TEXT:
    if(ff) {
        transform(istream_iterator<string>(ff),istream_iterator<string>(),ostream_iterator<string>(cout," "),[](const string s) {
            string str;
            transform(s.begin(),s.end(),back_inserter(str),[](const char &c) {
                return (char)(c+1);
            });
            return str;
        });
        ff.close();cout<<"\n";
    } 
    else cout<<"Ошибка в имени файла!\n";
    return 0;
ABC:
    int i = 0;
    i++;
    if (((name[i] == 'c') || (name[i] == 'C')) && ((name[i + 1] == 'o') || (name[i + 1] == 'O')) && ((name[i + 2] == 'n') || (name[i + 2] == 'N')) && ((name[i + 3] == '\0') || (name[i + 3] == '.'))) 
    { 
        printf("Было введено неверное имя\n");
        return 0; 
    }
    else goto TEXT;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.01.2017, 22:59
Ответы с готовыми решениями:

Установка Visual Studio 2012. Ошибка "Нет доступа"
При установке MicroSoft Visual Studio 2012 возникла проблема, &quot;Нет доступа&quot;.Потом я вошел в систему...

visual studio 2012 - ошибка "переопределение типа"
имею head.h #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;Windows.h&gt; #pragma...

Visual Studio 2012 Ошибка 1 error : Required file "tracker.exe" is missing.
vs 2012 #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int main() {...

Visual Studio не читает операторы, что начинаются на "glu" ("gluBuild2DMipmaps", "gluPerspective")
Данный код должен выводить на экран кубик который должен вращаться, но возникла проблема. Для...

27
1 / 1 / 0
Регистрация: 26.12.2016
Сообщений: 51
16.01.2017, 23:00  [ТС] 2
Вот это происходит при вводе "CON".
Миниатюры
Как запретить ввод слова "con" в консоли Visual Studio 2012  
0
1 / 1 / 0
Регистрация: 26.12.2016
Сообщений: 51
16.01.2017, 23:20  [ТС] 3
А можно ещё изменить программу так, чтобы текст в консоли выводился так-же как и в блокноте?
0
1269 / 1026 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
16.01.2017, 23:52 4
Это же классика!

В Windows нельзя создать файл или папку под названием "Con", ибо у Билла
Гейтса в детстве была прозвище, Con - ботаник.
И он постарался чтобы в его системе отсутствовали такие файлы и папки.
1
1 / 1 / 0
Регистрация: 26.12.2016
Сообщений: 51
17.01.2017, 00:54  [ТС] 5
Нужен запрет на ввод этого слова, так как оно ломает мне программу.
0
1269 / 1026 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
17.01.2017, 09:18 6
Лучший ответ Сообщение было отмечено Den_Nick как решение

Решение

Цитата Сообщение от Den_Nick Посмотреть сообщение
Нужен запрет на ввод этого слова
А в чём проблема? Если пользователь ввёл con, попроси его ввести другое имя.
C++
1
2
3
4
5
6
7
8
9
    while (true) {
        cin >> name;
        string nameLow = name;
        // Приводим к нижнему регистру, чтобы учесть Con, cON и т.д.
        transform(name.begin(), name.end(), nameLow.begin(), ::tolower);
        if (nameLow == "con")
            cout << "File name con is not allowed, enter another name." << endl;
        else break;
    }
1
1 / 1 / 0
Регистрация: 26.12.2016
Сообщений: 51
17.01.2017, 15:57  [ТС] 7
Если ввести буквы после con. Всё ломается! Может можно как-то задать, чтобы при вводе букв после con, программа выдавала сообщение об ошибке, и завершалась нормально, а не висела.
Миниатюры
Как запретить ввод слова "con" в консоли Visual Studio 2012  
0
1 / 1 / 0
Регистрация: 26.12.2016
Сообщений: 51
17.01.2017, 15:59  [ТС] 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
while (true) {
        cin >> name;  // abc.txt например 
        string nameLow = name; // Приводим к нижнему регистру, чтобы учесть Con, cON и т.д.
        transform(name.begin(), name.end(), nameLow.begin(), ::tolower);
        if (nameLow == "con" || nameLow == "con.")
        {
            cout << "Вы ввели запрещённое имя!" << endl;
            cout << "Вводите верный путь до файла." << endl;
            return 0;
        }
        else break;
    }
Моё нововведение в цикл. Нужно чтобы символы после "con." тоже учитывались как ошибка.
0
1269 / 1026 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
17.01.2017, 16:01 9
Лучший ответ Сообщение было отмечено Den_Nick как решение

Решение

Может лучше проверять это при открытии файла:
C++
1
2
3
4
5
ifstream ff(name.c_str());
if (!ff) {
    cout << "Cannot open file " << name << endl;
    exit(1);
}
1
1 / 1 / 0
Регистрация: 26.12.2016
Сообщений: 51
17.01.2017, 16:10  [ТС] 10
А что делать при вводе просто:
Файл: con.asvg
Преподаватель таким образом тоже ломает. Ему это доставляет удовольствие, поэтому он и так может.

Добавлено через 2 минуты
Можно ли добавить дополнительное условие для name в этом куске кода?
C++
1
if (nameLow == "con" || nameLow == "con.")
Такое условие, чтобы в любом случае при вводе con.[любые символы] выводился текст: "Вы ввели не верно!"
0
1269 / 1026 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
17.01.2017, 16:14 11
Кроме con есть и другие "запретные" имена, например prn.
Лучше проверять это на этапе открытия файла.
1
1 / 1 / 0
Регистрация: 26.12.2016
Сообщений: 51
17.01.2017, 16:17  [ТС] 12
Наш преподаватель требовал, что ему достаточно только con. Только ему удалось снова сломать программу вводом: "con.asjjk"
0
1269 / 1026 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
17.01.2017, 16:19 13
Цитата Сообщение от Den_Nick Посмотреть сообщение
Только ему удалось снова сломать программу вводом
Что значит сломать?
0
1 / 1 / 0
Регистрация: 26.12.2016
Сообщений: 51
17.01.2017, 16:20  [ТС] 14
Заставить программу зависнуть, и работать не правильно.

Добавлено через 42 секунды
Подобная проверка я думаю, что скорее всего не подойдёт.
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
char name[100];
    char name0[100] = "";
    char name1[] = "\\aux.";
    char name2[] = "\\clock$.";
    char name3[] = "\\com1.";
    char name4[] = "\\com2.";
    char name5[] = "\\com3.";
    char name6[] = "\\com4.";
    char name7[] = "\\lpt1.";
    char name8[] = "\\lpt2.";
    char name9[] = "\\lpt3.";
    char name10[] = "\\con.";
    char name11[] = "\\nul.";
    char name12[] = "\\prn.";
    char name13[] = "\\aux";
    char name14[] = "\\clock$";
    char name15[] = "\\com1";
    char name16[] = "\\com2";
    char name17[] = "\\com3";
    char name18[] = "\\com4";
    char name19[] = "\\lpt1";
    char name20[] = "\\lpt2";
    char name21[] = "\\lpt3";
    char name22[] = "\\con";
    char name23[] = "\\nul";
    char name24[] = "\\prn";
    int n = 0;
    int ch = 0;
    int ct = 0;
    int i = 0;
    int p = 0;
    int j = 0;
    char nam[50];
    char sym;
    char word[500];
    char word1[500];
    char str[5000];
 
 
    while (1){
        printf("Введите название файла:\n");
        gets(name);
        for (i = 0; i <= strlen(name); i++)
        {
            if (isspace(name[i]) || (name[0]=='c' && name[1]=='\0'))
                p++;
        }
        i = 0;
        if (p != 0)
        {
            printf("Ошибка\n");
            system("pause");
            exit(0);
        }
        if (strlen(name)==0)
        {
 
            system("pause");
            exit(0);
        }
        char * w = strrchr(name, '\\');
        if (w == NULL) {
            strcat(name0, name);
            if (strncmp(name0, name1, 5) == 0 || strncmp(name0, name2, 8) == 0 || strncmp(name0, name3, 6) == 0 ||
                strncmp(name0, name4, 6) == 0 || strncmp(name0, name5, 6) == 0 || strncmp(name0, name6, 6) == 0 ||
                strncmp(name0, name7, 6) == 0 || strncmp(name0, name8, 5) == 0 || strncmp(name0, name9, 6) == 0 ||
                strncmp(name0, name10, 5) == 0 || strncmp(name0, name11, 5) == 0 || strncmp(name0, name12, 5) == 0 ||
                strncmp(name0, name13, 4) == 0 || strncmp(name0, name14, 7) == 0 || strncmp(name0, name15, 5) == 0 ||
                strncmp(name0, name16, 5) == 0 || strncmp(name0, name17, 5) == 0 || strncmp(name0, name18, 5) == 0 ||
                strncmp(name0, name19, 5) == 0 || strncmp(name0, name20, 4) == 0 || strncmp(name0, name21, 5) == 0 ||
                strncmp(name0, name22, 5) == 0 || strncmp(name0, name23, 4) == 0 || strncmp(name0, name24, 4) == 0)
            {
                printf("Ошибка.\nВы ввели зарезервированное имя файла.\n");
                system("pause");
                exit(0);
            }
            else break;
        }
0
1269 / 1026 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
17.01.2017, 16:23 15
Если добавить проверку удачного открытия файла, то программа не зависнет, а завершиться, сообщив о неверном имени файла.

Добавлено через 55 секунд
Цитата Сообщение от Den_Nick Посмотреть сообщение
Подобная проверка я думаю, что скорее всего не подойдёт.
1
1 / 1 / 0
Регистрация: 26.12.2016
Сообщений: 51
17.01.2017, 16:24  [ТС] 16
Допустим, мы введём в мою программу: "con."
Цикл срабатывает и выводится: "Вы ввели запрещённое имя!"
А если же ввести: "con.sdfgfhds", программа зависает и всё! Далее можно вводить до бесконечности всё что угодно.
Миниатюры
Как запретить ввод слова "con" в консоли Visual Studio 2012  
0
1269 / 1026 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
17.01.2017, 16:27 17
Den_Nick, ты вообще читаешь, что я тебе пишу? Добавь проверку успешности открытия файла, и ничего у тебя зависать не будет.
1
1 / 1 / 0
Регистрация: 26.12.2016
Сообщений: 51
17.01.2017, 16:42  [ТС] 18
likehood, ты предлагаешь проверку на успешность открытия файла. Хорошо сейчас проверю, если не сработает, то отпишусь в этой теме по этому поводу. А пока, спасибо за помощь!

Добавлено через 8 минут
Сломалась всё-таки, раньше программа реагировала лучше на "con".
0
1 / 1 / 0
Регистрация: 26.12.2016
Сообщений: 51
17.01.2017, 16:43  [ТС] 19
Вывод:
Миниатюры
Как запретить ввод слова "con" в консоли Visual Studio 2012  
0
1 / 1 / 0
Регистрация: 26.12.2016
Сообщений: 51
17.01.2017, 16:45  [ТС] 20
С текстом пока работает. Это не может не радовать, goto тут не причём.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2017, 16:45
Помогаю со студенческими работами здесь

Visual Studio не читает операторы, что начинаются на "glu" ("gluBuild2DMipmaps", "gluPerspective")
Этот код должен выводить на экран кубик, который по идее должен вращаться, но возникла проблема:...

Из слова "клоун" путем "вырезок" и "склеек" его букв получить слова "уклон","кулон" и "колун"
Из слова &quot;клоун&quot; путем &quot;вырезок&quot; и &quot;склеек&quot; его букв получить слова &quot;уклон&quot;,&quot;кулон&quot; и...

Как запретить ввод второго символа "-" в StringGrid?
Здравствуйте, уважаемые форумчане. Решаю задачу: Формируется массив из 10 целых чисел путем...

Динамическая память. Ошибка С2143 пишет отсутствие ";" перед "тип" (Visual Studio 2010)
Это код filesIO.c Чтение данных для выч. модуля программы из файла (вектора X, чисел N, M; inNm...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru