kavinderrana121 Ответов: 3

Проверьте, равны ли две строки


Вот это проблема, которую мы должны проверить, что если две srings равны или нет
например:
s1[]=akash and s2[]=ashka 
равны ли они
моя программа показывает
NO
всегда для каждой строки ;
Здесь t - количество тестовых случаев;

Что я уже пробовал:

#include<stdio.h>
#include<string.h>
int main(){
int t,i,j;
scanf("%d",&t);
while(t>0){
    char s1[100],s2[100];
    scanf("%s ",s1);
    scanf("%s",s2);
    int count=0;
    int found[100];
    for(i=0;i<strlen(s1)-1;i++){
        for(j=0;j<strlen(s1);j++){
            if(s1[i]==s2[j]){
                found[i]=1;
                break;
            }


        }
    }
       for(i=0;i<strlen(s1);i++){
           if(found[i]!=1){
          count=1;
          break;

           }
       }
    if(count==1)
    printf("NO");
    else
    printf("YES");







    t--;
}



}

Richard MacCutchan

Используйте функцию strcmp().

3 Ответов

Рейтинг:
1

Jochen Arndt

Я не совсем уверен в определении "равно" здесь, но ошибка заключается в том, что ваши циклы имеют разные условия остановки:

for(i=0;i<strlen(s1)-1;i++){
/* ... */
}
for(i=0;i<strlen(s1);i++){
Первый цикл имеет на одну итерацию меньше так что последний элемент обрабатывается вторым циклом (found[strlen(s1)-1]) никогда не устанавливается.

Примечание:
Локальные переменные не инициализируются с помощью C/C++ при обычных (не отладочных) сборках. Так что вы должны сделать это с помощью кода:
int found[100];
memset(found, 0, sizeof(found));
Невыполнение этого требования может привести к неправильному выводу "TRUE" , когда все незаданные элементы содержат значение "1".


Рейтинг:
1

Patrice T

Это просто неправильно

for(i=0;i<strlen(s1)-1;i++){
    for(j=0;j<strlen(s1);j++){
        if(s1[i]==s2[j]){
            found[i]=1;
            break;
        }
    }
}

Струнные s1[]="Акаш" и s2[]="ашка" равны, если
s1[0]==s2[0] и s1[1]==s2[1] и s1[2]==s2[2] и s1[3]==s2[3] ...
С вашим кодом, s1[]="abcd" и в S2[]="надо" будет соответствовать.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш cpde, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
0

CPallini

Ну а в производственном коде я бы использовал strcmp или, что еще лучше, strncmp функция (обратите внимание, что вы уже используете C библиотеку string strlen функция).

Простота strcmp реализация может быть

int strcmp(const char * s1, const char * s2)
{
  for (;;)
  {
    if ( *s1 > *s2) 
      return 1;
    else if ( *s1 < *s2)
      return -1;
    else if (*s1 == 0) 
      return 0;
    ++s1, ++s2;
  } 
}


Richard MacCutchan

else if (*s1 == 0)
Но что, если s2 все еще имеет больше символов?

CPallini

Но что, если s2 все еще имеет больше символов?
Тогда вы, возможно, используете квантовый компьютер. :-D

Richard MacCutchan

Э-э?

CPallini

если (*s1 не больше *s2) и (*s1 не меньше *s2), то (*s1 равно *s2). Разве вы не согласны со мной?

Richard MacCutchan

s1 = "abd";
s2 = "abdx";
Если вы перестанете сравнивать в конце s1, то они не равны.

CPallini

Эй, Ричард, программа останавливается, когда (*s1 == 0) и (*s2 == 0), потому что она уже проверила их на равенство (имплицитно, потому что они не отличаются).

CPallini

Тестовая программа:

#include <stdio.h>

int strcmp(const char * s1, const char * s2)
{
  for (;;)
  {
    if ( *s1 > *s2)
      return 1;
    else if ( *s1 < *s2)
      return -1;
    else if (*s1 == 0)
      return 0;
    ++s1, ++s2;
  }
}

int main()
{
  const char * s1 = "abd";
  const char * s2 = "abdx";
  printf("Richard's test: %d\n", strcmp(s1,s2));
  return 0;
}

выход:
Richard's test: -1

Richard MacCutchan

Ах да, это то, что я пропустил. Мне следовало бы знать, что лучше не задавать вопросов такому опытному человеку, как ты.

CPallini

Пожалуйста, не обманывай меня :-)
Допрос-это нормально, мне нравится ваш подход.

Richard MacCutchan

Ставь 5 за твое терпение по отношению ко мне.

CPallini

Большое спасибо.