#include <stdio.h>

int main()
{
    char w[100], o[100];
    gets(w);
    gets(o);
    printf("%s\n%s\n",w,o);
    if(w==o)
        printf("YES\n");
    else
        printf("NO\n");

    return 0;   
}

এখানে দুইটা স্ট্রিং সমান হলে YES প্রিন্ট করার কথা, কিন্ত এখানে No প্রিন্ট করে। এর কারণ কী এবং এই দুইটা স্ট্রিং সমান দেখানোর কোনো উপায় আছে কি?

asked 26 Aug, 17:33

pollob1563's gravatar image

pollob1563
1196

edited 27 Aug, 04:24

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
48618


স্ট্রিং নামের কোনো কিছু সি বোঝে না। তাই সি সরাসরি স্ট্রিং তুলনা করতে পারে না। সি-তে স্ট্রিং আসলে ক্যারেক্টার অ্যারে। আর দুটি অ্যারে সরাসরি অপারেটর দিয়ে তুলনা করা যায় না। তাই if (str1 == str2) অর্থহীন। এভাবে লিখলে কম্পাইলার দুই দিকে দুটি ক্যারেক্টার পয়েন্টার দেখতে পায়। তাই তাদের ঠিকানা তুলনা করে। দুটি স্ট্রিঙের ঠিকানা যেহেতু এক হয় না তাই এটা সবসময় মিথ্যা হয়।

দুটি স্ট্রিং তুলনা করার দুটি উপায় আছে, লাইব্রেরি ফাংশন ব্যবহার করা এবং নিজেই ক্যারেক্টার বাই ক্যারেক্টার তুলনা করা। শেষ কাজটির জন্য আলাদা ফাংশন তৈরি করে নেয়া যেতে পারে।

string.h হেডার ফাইলে একটা ফাংশন আছে strcmp() এটা দিয়ে দুটি স্ট্রিং তুলনা করা যায়। দুটি স্ট্রিং সমান হলে ফাংশনটি ০ রিটার্ন করে। আপনার কাজের জন্য তাই এটা ব্যবহার করা যায়।

if (strcmp(s1, s2) == 0) {
    printf("YES\n");
}
else {
    printf("NO\n");
}

দ্বিতীয় পদ্ধতি হচ্ছে দুটি স্ট্রিঙের প্রতিটি ক্যারেক্টার পরীক্ষা করা।

int len = strlen(s1);     //strlen() ফাংশনটি string.h হেডার ফাইলে থাকে
int flag = 1;
for (i=0; i<len; i++) {
    if (s1[i] == s2[i])
        continue;
    else {
        flag = 0
        break;
    }
}

if (flag == 1) printf("YES\n");
else printf("NO\n");

স্ট্রিং ইনপুট নেয়ার জন্য gets() ব্যবহার না করাই উত্তম। scanf() ব্যবহার করুন।

permanent link

answered 27 Aug, 04:22

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
48618

Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×390
×56
×55

question asked: 26 Aug, 17:33

question was seen: 143 times

last updated: 27 Aug, 04:24