Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 1
Регистрация: 23.10.2013
Сообщений: 25

Как получить true при сравнении указанной строки и строки из буфера в if?

30.09.2014, 13:04. Показов 2223. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Использую C++Builder 6.

Как получить true при сравнении указанной строки и строки из буфера в if? У меня постоянно получается false.
Вытаскиваю имя пользователя который залогинился в системе. Сравниваю логины которые указаны в программе с тем что вытащил из буфера. Вроде одинаково, но все равно false. Выводил в файл и то и другое, все одинаковое, но все равно false. Подскажите пожалуйста, где собака зарыта?

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
#include <vcl.h>
#include <typeinfo.h>
#pragma hdrstop
 
#include "Lmcons.h"
#include "Main.h"
 
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream.h>
#include <sysmac.h>
 
 
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TMainForm *MainForm;
 
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
    : TForm(Owner)
{
        Application->ShowMainForm = false;
        unsigned long Size = 256;
        char  *buff = new char[Size];
        GetUserName(buff, &Size);
 
// тут проверял как оно все в файле выводится
FILE *a; 
a=fopen("a.txt", "w"); 
fputs(buff, a); 
fclose(a);  
 
 
        if(buff!="IvanovII")
        {
        Application->MessageBox("Доступ запрещен.","Запрещено!!!!!!!!!");
        ExitProcess(0);
        } else
    {
        Application->ShowMainForm = true;
        Label2->Caption = buff;
            }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.09.2014, 13:04
Ответы с готовыми решениями:

При любом сравнении получить True
Нам нужно решение, которое может работать в любой ситуации. Результат вашего решения должен работать для любого сравнения с чем-либо. Вы...

Как получить значение из строки, где checkbox.isChecked = true в GridMvc?
У меня есть такой грид: @Html.Grid(Model).Named(&quot;assetsGroupsGrid&quot;).Columns(columns =&gt; { columns.Add(c =&gt; c.Name) ...

Удаление строки из БД при сравнении даты
Добрый день. Имеется база данных, в которой в одной из колонок записывается дата. Дата пишется следующим образом. 02.05.2018 Заносится...

7
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
30.09.2014, 13:06
Для сравнения char* используется strcmp, а не простое сравнение указателей:
C++
1
2
3
4
if( strcmp(buff, "IvanovII") )
{
    // Строки не равны
}
1
1 / 1 / 1
Регистрация: 23.10.2013
Сообщений: 25
30.09.2014, 17:00  [ТС]
То есть, когда сравнивается строка и содержимое переменной с такой же строкой, они между собой не равны? И поэтому нужно преобразовывать содержимое переменной. Я правильно понял?

Нужно писать примерно так:
if(strcmp(buff,"IvanovII"||"PetrovPP"){. ..}

Добавлено через 8 минут
Так как я написал if(strcmp(buff,"IvanovII"||"PetrovPP"){. ..} , не получается ))) хотел смухлевать. А с одной фамилией работает! Спасибо огромное, буду пробовать прилепить еще несколько фамилий для сравнения логинов для допуска.

Добавлено через 3 часа 13 минут
Если я правильно понял, то такая проверка при совпадении возвращает 0, т.е. FALSE.

Тут нашел такое описаниеЖ

int strcmp(const char *str1, const char *str2)

Прототип:
string.h
Описание:
Функция strcmp() осуществляет лексикографическую проверку двух строк, оканчивающихся нулевыми символами, и возвращает целое число со следующим значением:

Число Значение
Меньше 0 str1 меньше, чем str2
0 str1 равна str2
Больше 0 str1 больше, чем str2

Добавлено через 25 минут
Добил я это сравнение.

Окончательный вариант получился такой:

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
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream.h>
#include <sysmac.h>
 
 
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TMainForm *MainForm;
 
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
    : TForm(Owner)
{
        Application->ShowMainForm = false;
        unsigned long Size = 256;
        char  *buff = new char[Size];
        GetUserName(buff, &Size);
 
// тут проверял как оно все в файле выводится
FILE *a; 
a=fopen("a.txt", "w"); 
fputs(buff, a); 
fclose(a);  
  
        if((strcmp(buff,"IvanovII")==0)||(strcmp(buff,"PetrovPP")==0))
{
Application->ShowMainForm = true;
        Label2->Caption = buff;
        
} else
{
Application->MessageBox("Доступ запрещен.","Запрещено!!!!!!!!!");
        ExitProcess(0);
}
}

Огромное спасибо, UI!!!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
30.09.2014, 17:28
Лучший ответ Сообщение было отмечено mpol как решение

Решение

А что,
C++
1
2
3
4
5
6
7
8
9
    String names[] = {"IvanovII", "PetrovPP"};
    if(AnsiIndexStr(buff, names, 2) > -1) // нужно добавить #include <StrUtils.hpp>
    {
        // Вход разрешен
    }
    else
    {
        // Вход запрещен
    }
в 6-ом Билдере никак нельзя задействовать? Если имен будет больше двух - самое то, что нужно, придется только добавить их в массив names и менять длину массива в вызове AnsiIndexStr. А в твоем варианте придется добавлять еще и еще strcmp...

У меня BCB6 нет в наличии, просто интересуюсь. В новых-то версиях мой вариант прекрасно работает...
2
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
30.09.2014, 17:47
Даже если AnsiIndexStr там и нет - можно TStringList задействовать, а там IndexOf есть точно.
1
1 / 1 / 1
Регистрация: 23.10.2013
Сообщений: 25
01.10.2014, 11:04  [ТС]
Проверил с AnsiIndexStr, в 6 билдере все отлично работает! Снова спасибо! Сейчас еще проверю и TStringList.

Добавлено через 21 минуту
Посмотрел TStringList, как по мне, там будет куча лишних телодвижений, которые в моей программке по существу не нужны. Использование AnsiIndexStr самое оно! За TStringList тоже большое спасибо!
0
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
01.10.2014, 11:11
Да в первом листинге вы сравнивали указатель на массив char со строкой.
Если нет желания использовать функцию strcmp() то есть ещё вариант преобразовать в AnsiString
и сравнивать как строки ANSI. В более новых версиях C++Buildera используется двухбайтовая юникод кодировка UnicodeString и wchar_t.

C++
1
2
3
4
5
6
7
8
AnsiString strbuf =  (AnsiString)buf;
if( strbuf == "Ivanoff" || strbuf == "Petroff" ) {
  // действия 
 
} else {
  // действия
 
}

Обратное преобразование из AnsiString в char:

C++
1
2
AnsiString string = "The ANSI string";
char* chr = string.c_str();
1
1 / 1 / 1
Регистрация: 23.10.2013
Сообщений: 25
01.10.2014, 11:30  [ТС]
Да, согласен, первоначальный вариант был тупостью из-за незнания, поэтому и задал тут вопрос, что бы знающие люди помогли. Помогли, спасибо им за это! А по поводу преобразования, конечно можно так сделать, добавить выборку логинов из массива и все будет работать. Только зачем? Ведь все уже работает. Да и вариант с AnsiIndexStr мне нравится. Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.10.2014, 11:30
Помогаю со студенческими работами здесь

Как убрать перенос строки в конце RichEdit при вставке из буфера обмена
Здравствуйте, уважаемые форумчане! Подскажите пожалуйста: Копирую текст. Вставляю в своей программе в поле RichEdit. Текст...

Определение значения обратных ссылок при сравнении строки с шаблоном
Ребят, подскажите, пожалуйста Необходимо определить значения обратных ссылок при сравнении строк /&lt;a...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru