сравнение строки пошло не так

avatar
Kalapala Teja
8 апреля 2018 в 01:50
49
3
-2

Я получил вывод как неравный, можете ли вы объяснить мне, почему

#include <stdio.h>

int main()
{
    char str1[] = "hello";
    char str2[] = "hello";

    if (str1 == str2)
        printf("equal");
    else
        printf("unequal");

    return 0;
}
Источник
DYZ
8 апреля 2018 в 05:07
1

Возможный дубликат Как сравнить указатель со строками в C

Ответы (3)

avatar
Polaris000
8 апреля 2018 в 05:56
0

Когда вы хотите сравнить две строки, вы действительно хотите увидеть, находится ли каждый символ в одной строке в соответствующей позиции другой строки.

Используемые здесь строковые переменные (str1 and str 2) являются просто указателями на базовые адреса этих строк.

Следовательно, str1 == str2 означает, что вы просто сравниваете, если обе строки имеют одинаковые базовые адреса, что, конечно же, неверно.

Здесь вы можете использовать файл string.h, который имеет strcmp() или функцию сравнения строк.

Это работает следующим образом: Он перебирает строку и проверяет разницу в значениях ascii отдельных символов в соответствующих позициях (одинаковое значение индекса). Если все символы одинаковые, возвращается 0.

В противном случае встречается положительное или отрицательное значение в зависимости от порядка передачи строк в strcmp.

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

использование:
if (!strcmp(str1, str2)) puts("equal"); else puts("unequal");

avatar
Raman Mishra
8 апреля 2018 в 02:15
1

Вы сравниваете адреса контейнера данных, которые являются str1 и str2, если вы знаете java, то есть метод equals и метод contentEquals, если вы используете метод equals, он сравнивает ссылки на объекты, но если вы делаете contentEquals, он сравнивает содержимое (данные) находятся в объектах.

В c вы должны были уже знать, что имя строки содержит базовый адрес. Вот почему вам не нужно вводить &(address of operator) while using the scanf, это главная причина, когда вы вводите str1==str2, он сравнивает адрес, а не данные внутри строки.

В c str1 и str2 представляют собой просто двухсимвольный массив с \0 в конце. Теперь, когда вы делаете

if(str1==str2) //it compares the address of 
//variables not the content as 
//you are comparing the base address
//of the strings str1 and str2. 

Правильная версия должна быть:

#include <stdio.h>
#include <string.h>
int main()
{
char str1[]="hello";
char str2[]="hello";
if(strcmp(str1, str2) == 0)
    puts("equal");
else
    puts("unequal");
return 0;
}

Если вы хотите убедиться, что можете использовать это, printf(“%d”, &str1); printf(“%d”, &str2); они оба не будут равны.

avatar
Pablo
8 апреля 2018 в 01:58
3

Это потому, что == сравнивает адреса str1 и str2, а не адрес содержимое строки. Вы должны использовать strcmp для этого:

#include <stdio.h>
#include <string.h>
int main()
{
    char str1[]="hello";
    char str2[]="hello";
    if(strcmp(str1, str2) == 0)
        puts("equal");
    else
        puts("unequal");
    return 0;
}

будет правильной версией. См. https://ideone.com/wJpL2I

Обратите внимание, что в C строка — это просто последовательность символов, заканчивающаяся '\0'-завершающий байт. str1 и str2 — оба массива, но когда вы делаете str1 == str2 они распадаются на указатели и то, что вы сравниваете, это память место, где массивы хранятся в памяти. Это два разных массива (хотя содержимое у них одинаковое), поэтому адрес памяти у них конечно будет разный, поэтому получается unequal. Вот почему вам нужно strcmp для сравнения содержимого массивов char.