Войти
ФлеймФорумПрограммирование

Не понял ! А що с++ не может сравнить два char array ?!

Страницы: 1 2 3 4 5 Следующая »
#0
(Правка: 19:27) 19:23, 16 мая 2020

Я думал с++ сделает сравнение двух строк и определит совпали они или нет.

int a = 2;
char myword[] = { 'H', 'e', 'l','l', 'o', 'l', 'o', '\0' };
    char myword2[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
    if (myword2==myword) { a = 1;}

Но читаю в инете о том что надо самому писать:

int compare(char a[],char b[]){
    for(int i=0;a[i]!='\0';i++){
        if(a[i]!=b[i])
            return 0;
    }
    return 1;
}

Или юзать Win api функцию сравнения строк.
Не порядок !


#1
(Правка: 19:33) 19:33, 16 мая 2020

ronniko
> Я думал с++ сделает сравнение двух строк и определит совпали они или нет.

Это не C++, и это не строки, - это из Си. В данном случае ты сравниваешь не строки, а адреса  (с ASMом в голове можно было догадаться до этого).

А вот у С++ с этим нет особых проблем, -

std::string s1 = "Hellolo";
std::string s2 = "Hello";

if (s1 == s2)
{
    //do smth
}

ronniko
> Или юзать Win api функцию сравнения строк.

K&R почитай, во избежание глупых вопросов

#2
(Правка: 19:33) 19:33, 16 мая 2020

memcmp для сравнения любой памяти с указанием её размера, strcmp - сравнение null-terminated строк

#3
(Правка: 19:51) 19:45, 16 мая 2020
std::string s1 = "Hellolo";
std::string s2 = "Hello";

Вот как раз для новичка это все костыли. В которых надо разобраться !
И еще всякие std namespace курить.

То есть так просто не взять и не сравнить сразу !

Но дело не в этом , а в том что я пишу свой язык.
И вот как раз это сделаю нормально.

PS: Выхлоп из godbolt.org на if (s1==s2) жестяк, адский Call !

lea     eax, DWORD PTR _s1$[ebp]
        push    eax
        lea     ecx, DWORD PTR _s2$[ebp]
        push    ecx
        call    bool std::operator==<char,std::char_traits<char>,std::allocator<char> >(std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &) ; std::operator==<char,std::char_traits<char>,std::allocator<char> >
        add     esp, 8
        movzx   edx, al
        test    edx, edx
        je      SHORT $LN5@testCustom
#4
20:12, 16 мая 2020

ronniko
std - это часть языка.
И теже строки вполне простые и понятные.
В отличии от массива чаров, работать с которым напрямую в современном мире - имеет смысл в весьма редких случаях.

#5
(Правка: 20:33) 20:19, 16 мая 2020

ronniko
> Выхлоп из godbolt.org на if (s1==s2) жестяк, адский Call !
https://godbolt.org/z/hAbgc3

#6
(Правка: 20:47) 20:36, 16 мая 2020

entryway
Спасибо так лучше.

Но я хочу сделать у себя два варианта:

mov ecx,7      
cld           
mov esi, stringA  
mov edi, stringB
repe cmpsb     
cmp ecx,0
je strings_are_equal 
И второй sse сравнение.

#7
20:38, 16 мая 2020

ronniko
> Но дело не в этом , а в том что я пишу свой язык
Ты бы сначала C++ освоил, ну или хотя бы Си. А то даже не знаешь, как строки правильно сравнивать.

#8
(Правка: 20:40) 20:40, 16 мая 2020

Так вот с++ и создает кучу вариаций как сравнивать строки. На такой простой вещи в с++ можно неделю изучать разные техники кунг-фу !

А по сути то достаточно двух вариантов. В большинстве случаев.

#9
20:52, 16 мая 2020

ronniko
> И второй sse сравнение.
Не поможет. Кресты просто сравнят длины за один такт и вернут false, пока ты на sse будешь процессор греть.

#10
20:54, 16 мая 2020

почему бы просто на паскале не писать?

#11
(Правка: 20:57) 20:54, 16 мая 2020

entryway

Не поможет. Кресты просто сравнят длины за один такт и вернут false, пока ты на sse будешь процессор греть.

Сравнить длину строк хорошо.

Но бывает:
s1 = alis;
s2 = alis Tom Home;

Потому я и сказал что пару вариантов почти всегда хватает.

#12
(Правка: 20:56) 20:56, 16 мая 2020
почему бы просто на паскале не писать?

Новый стиль программирования у меня.
Я уже не пишу код руками и не вникаю в мелочи языка.
#13
20:57, 16 мая 2020

ronniko
> Сравнить длину строк хорошо.
>
> Но бывает:
> s1 = alis;
> s2 = alis Tom Home;
И?

#14
(Правка: 21:03) 20:59, 16 мая 2020

Второй вопрос.
Допустим на c++ (пока я не беру virtual функции и таблицы) есть 5 функций.
Как с++ автоматом для них сделает таблицу и может ли ?

fun1() { some code }
fun2() { some code }
fun3() { some code }
fun4() { some code }
fun5() { some code }
И с++ генерит такую таблицу:
FunTab1 &fun1,&fun2,&fun3,&fun4,&fun5
Страницы: 1 2 3 4 5 Следующая »
ФлеймФорумПрограммирование