আমি স্ট্রিংগুলি কীভাবে তুলনা করব?


182

আমি চেষ্টা করছি যে কোনও ব্যবহারকারী কোনও শব্দ বা চরিত্র প্রবেশ করিয়ে দিতে, এটি সঞ্চয় করতে এবং তারপরে ব্যবহারকারী মুদ্রণ না করে যতক্ষণ না প্রোগ্রামটি থেকে বেরিয়ে আসে ততক্ষণ এটি মুদ্রণ করতে পারে। আমার কোডটি এর মতো দেখাচ্ছে:

#include <stdio.h>

int main()
{
    char input[40];
    char check[40];
    int i=0;
    printf("Hello!\nPlease enter a word or character:\n");
    gets(input);
    printf("I will now repeat this until you type it back to me.\n");

    while (check != input)
    {
        printf("%s\n", input);
        gets(check); 
    }

    printf("Good bye!");


    return 0;
}

সমস্যাটি হ'ল আমি ইনপুট স্ট্রিংয়ের মুদ্রণ পেতে থাকি, এমনকি যখন ব্যবহারকারী (চেক) দ্বারা ইনপুট মূল (ইনপুট) এর সাথে মেলে। আমি কি দুটোকে ভুল করে তুলনা করছি?


13
gets( )মান থেকে সরানো হয়েছে। fgets( )পরিবর্তে ব্যবহার করুন।
এডওয়ার্ড কারাক

1
নোট যে এই উত্তর করতে কেন strcmp()ফিরতি শূন্য যখন তার ইনপুট সমান সমতা, বৈষম্য, কম, তার চেয়ে অনেক বেশী জন্য স্ট্রিং তুলনা কিভাবে কম বা সমান বর্ণনা দেওয়া আছে এবং এর চেয়ে বড় বা সমান। সমস্ত স্ট্রিং তুলনা সমতার জন্য নয়। কেস সংবেদনশীল তুলনা আবার আলাদা; অন্যান্য বিশেষ তুলনাগুলি (উদাহরণস্বরূপ অভিধানের অর্ডার) আরও বেশি বিশেষায়িত তুলকগুলির প্রয়োজন হয় এবং আরও জটিল তুলনার জন্য রেজিওস রয়েছে।
জোনাথন লেফলার

এটিও নোট করুন যে এখানে একটি অনুলিপিযুক্ত প্রশ্ন রয়েছে যা আমি এর আগে কয়েক বছর আগে জিজ্ঞাসা করা একটি স্ট্রিংয়ের সাথে কোনও মান মেলে কিনা তা আমি কীভাবে পরীক্ষা করব
জোনাথন লেফলার


এই প্রশ্নটি ভাল, তবে ব্যবহারটি gets()কোনও যায় না। এটি সি 11 এর পরেও মান থেকে সরানো হয়েছে -> দয়া করে পড়ুন কেন
রবার্টস

উত্তর:


274

আপনি (দরকারীভাবে) ব্যবহার করে স্ট্রিংগুলির তুলনা করতে পারবেন না !=বা ==আপনার ব্যবহার করতে হবে strcmp:

while (strcmp(check,input) != 0)

এর কারণ হ'ল !=এবং ==কেবল সেই স্ট্রিংগুলির বেস ঠিকানাগুলি তুলনা করবে। স্ট্রিংয়ের সামগ্রীগুলি নিজেরাই নয়।


10
জাভাতে একই, যা কেবল ঠিকানার সাথে তুলনা করতে পারে।
টেলিরিক

29
রচনা while (strcmp(check, input))যথেষ্ট এবং এটি অনুশীলন হিসাবে বিবেচিত হয়।
শিব


7
এটি strncmp ব্যবহার করা নিরাপদ! বাফার ওভারফ্লো চাই না!
ভাসমান

@ ফ্লোম যদি আপনার কাছে আসলে স্ট্রিং না থাকে তবে জ্ঞাত দৈর্ঘ্যের অ-শূন্য অক্ষরের শূন্য-প্যাডযুক্ত ক্রমগুলি অবশ্যই নিশ্চিত হন যে এটি সঠিক প্রসারণ হবে। তবে এটি সম্পূর্ণ আলাদা কিছু!
উত্সর্গীকর্তা

33

ঠিক আছে কয়েকটি জিনিস: getsঅনিরাপদ এবং এটিকে প্রতিস্থাপন করা উচিত fgets(input, sizeof(input), stdin)যাতে আপনি কোনও বাফার ওভারফ্লো না পান।

তারপরে, স্ট্রিংগুলির তুলনা করতে আপনাকে অবশ্যই ব্যবহার করতে হবে strcmp, যেখানে 0 এর একটি ফেরতের মান নির্দেশ করে যে দুটি স্ট্রিং মিলছে। সাম্যতা অপারেটর ব্যবহার করে (যেমন। !=) দুটি স্ট্রিংয়ের ঠিকানাটির সাথে পৃথক পৃথক ব্যক্তির বিপরীতে তুলনা charকরে।

এবং এটিও নোট করুন যে, উদাহরণস্বরূপ এটি কোনও সমস্যা সৃষ্টি করে না, fgetsনতুন রেখাযুক্ত অক্ষর সংরক্ষণ করে, '\n'বাফারগুলিতেও; gets()না. যদি আপনি ব্যবহারকারীর ইনপুটটিকে fgets()স্ট্রিং আক্ষরিকের সাথে তুলনা করেন যেমন "abc"এটি কখনই মেলে না (যদি না বাফার খুব ছোট থাকে যাতে এটি এতে '\n'ফিট না হয়)।


আপনি কি দয়া করে "\ n" এর সম্পর্ক / সমস্যা এবং স্ট্রিং আক্ষরিক সম্পর্কে স্পষ্ট করতে পারেন? অন্যান্য পুরো ফাইলের সাথে কোনও ফাইলের স্ট্রিং (লাইন) এর সাথে তুলনা করার ক্ষেত্রে আমি সমান ফলাফল পাচ্ছি না।
অক্ষম

@ অসমর্থ - যদি আপনি কোনও ফাইল থেকে একটি লাইন পড়ে থাকেন fgets()তবে স্ট্রিংটি "abc\n"কারণ হতে পারে fgets()নতুন লাইন রাখে। যদি আপনি এটির সাথে তুলনা করেন তবে "abc"নাল বাইট সমাপ্তি "abc"এবং পঠিত ডেটাতে নতুন লাইনের মধ্যে পার্থক্যের কারণে আপনি 'সমান নয়' পাবেন । সুতরাং, আপনাকে নতুন লাইনটি জ্যাপ করতে হবে। buffer[strcspn(buffer, "\n")] = '\0';এটির জন্য নির্ভরযোগ্য এক-লাইন উপায় হ'ল বাফারে কোনও ডেটা আছে কিনা তা নির্বিশেষে সঠিকভাবে কাজ করার যোগ্যতা রয়েছে বা সেই ডেটাটি কোনও নতুন লাইনের সাথে শেষ হয়েছে কিনা। সহজেই ক্র্যাশ হয়ে যায় নতুন লাইনটি জ্যাপিংয়ের অন্যান্য উপায়।
জোনাথন লেফলার

এই উত্তরটি কোডের সমস্যাগুলিকে নির্ভুলভাবে সম্বোধন করে, যখন সর্বাধিক উত্সাহিত এবং গৃহীত উত্তর কেবল প্রশ্নের শিরোনামের উত্তর দেওয়ার জন্য কভার করে। বিশেষ করে শেষ অনুচ্ছেদে উল্লেখ করা সুপার। +1
রবার্টস

11

ব্যবহার strcmp

এটি string.hলাইব্রেরিতে রয়েছে এবং এটি খুব জনপ্রিয়। strcmpস্ট্রিং সমান হলে 0 প্রদান করুন। দেখুন এই কি একজন ভাল ব্যাখ্যা জন্য strcmpআয়।

মূলত, আপনাকে এটি করতে হবে:

while (strcmp(check,input) != 0)

অথবা

while (!strcmp(check,input))

অথবা

while (strcmp(check,input))

আপনি না পরীক্ষা করতে এই , উপর একটি টিউটোরিয়াল strcmp


7

আপনি সরাসরি অ্যারের সাথে তুলনা করতে পারবেন না

array1==array2

আপনি তাদের চার-বাই-চরের তুলনা করা উচিত; এর জন্য আপনি একটি ফাংশন ব্যবহার করতে পারেন এবং একটি বুলিয়ান (সত্য: 1, মিথ্যা: 0) মানটি ফিরিয়ে আনতে পারেন। তারপরে আপনি এটি লুপের পরীক্ষার অবস্থায় ব্যবহার করতে পারেন।

এটা চেষ্টা কর:

#include <stdio.h>
int checker(char input[],char check[]);
int main()
{
    char input[40];
    char check[40];
    int i=0;
    printf("Hello!\nPlease enter a word or character:\n");
    scanf("%s",input);
    printf("I will now repeat this until you type it back to me.\n");
    scanf("%s",check);

    while (!checker(input,check))
    {
        printf("%s\n", input);
        scanf("%s",check);
    }

    printf("Good bye!");

    return 0;
}

int checker(char input[],char check[])
{
    int i,result=1;
    for(i=0; input[i]!='\0' || check[i]!='\0'; i++) {
        if(input[i] != check[i]) {
            result=0;
            break;
        }
    }
    return result;
}

1
আপনি কি দয়া করে আপনার সমাধান সম্পর্কে আরও বিশদ যুক্ত করতে পারেন?
অ্যাবারিসোন

হ্যাঁ এই স্ট্রিং। হেডার ব্যবহার না করেই স্ট্রিম্প্প ফাংশন এবং সলিউশনের প্রতিস্থাপন হ'ল জংওয়্যার
মৃজেসু

2
এটা কাজ করে না. যখন checkerখুঁজে বের করে '\0'স্ট্রিং এক, এটা জন্য আরেকটি স্ট্রিং পরীক্ষা নেই '\0'। ফাংশনটি 1("সমান") প্রদান করে এমনকি যদি একটি স্ট্রিং কেবলমাত্র অন্যটির উপসর্গ হয় (উদাহরণস্বরূপ, "foo"এবং "foobar")।
lukasrozs

1
আমি ||পরিবর্তে ব্যবহার করতে হবে &&
lukasrozs

3

পয়েন্টার ধারণাটিতে আপনাকে স্বাগতম প্রারম্ভিক প্রোগ্রামারগুলির প্রজন্মগুলি ধারণাটি অধরা খুঁজে পেয়েছে, তবে আপনি যদি একজন দক্ষ প্রোগ্রামার হয়ে উঠতে চান তবে আপনাকে অবশ্যই শেষ পর্যন্ত এই ধারণাটি আয়ত্ত করতে হবে - এবং তদতিরিক্ত, আপনি ইতিমধ্যে সঠিক প্রশ্ন জিজ্ঞাসা করছেন। এটা ভালো.

এটি কী আপনার ঠিকানাটি পরিষ্কার? এই চিত্রটি দেখুন:

----------     ----------
| 0x4000 |     | 0x4004 |
|    1   |     |    7   |
----------     ----------

ডায়াগ্রামে, পূর্ণসংখ্যা 1 0x4000 ঠিকানায় মেমরিতে সংরক্ষণ করা হয় । কেন একটি ঠিকানায়? কারণ স্মৃতিশক্তি বড় এবং অনেকগুলি পূর্ণসংখ্যার সঞ্চয় করতে পারে যেমন একটি শহর বড় এবং অনেক পরিবার থাকতে পারে। প্রতিটি পরিবার একটি বাড়িতে থাকায় মেমরির স্থানে প্রতিটি পূর্ণসংখ্যা সংরক্ষণ করা হয়। প্রতিটি মেমরি অবস্থানকে একটি দ্বারা চিহ্নিত করা হয় ঠিকানা , যেমন প্রতিটি ঘর একটি ঠিকানা দ্বারা চিহ্নিত করা হয়।

চিত্রের দুটি বাক্স দুটি স্বতন্ত্র মেমরি অবস্থানের প্রতিনিধিত্ব করে। এগুলি আপনি ঘর হিসাবে মনে করতে পারেন। পূর্ণসংখ্যা 1 0x4000 ঠিকানায় (4000 এলম সেন্ট "ভাবেন) ঠিকানায় মেমরি লোকেশনে অবস্থান করে। পূর্ণসংখ্যা 7 ঠিকানা 0x4004 এ স্মৃতিতে অবস্থান করে (মনে করুন, "4004 এলম সেন্ট")।

আপনি ভেবেছিলেন যে আপনার প্রোগ্রামটি 1 এর সাথে 7 এর তুলনা করছে, তবে তা হয়নি। এটি 0x4000 কে 0x4004 এর সাথে তুলনা করছিল। সুতরাং আপনি যখন এই পরিস্থিতি আছে কি হবে?

----------     ----------
| 0x4000 |     | 0x4004 |
|    1   |     |    1   |
----------     ----------

দুটি পূর্ণসংখ্যা একই তবে ঠিকানাগুলি পৃথক। আপনার প্রোগ্রাম ঠিকানাগুলির সাথে তুলনা করে।


2

আপনি যখনই স্ট্রিংগুলির সাথে তুলনা করার চেষ্টা করছেন, প্রতিটি চরিত্রের সাথে সম্মানের সাথে তাদের তুলনা করুন। এর জন্য আপনি স্ট্রিং ফাংশনটিতে strcmp (ইনপুট 1, ইনপুট 2) নামে ব্যবহার করতে পারেন; এবং আপনার নামক হেডার ফাইলটি ব্যবহার করা উচিত#include<string.h>

এই কোড ব্যবহার করে দেখুন:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h>  

int main() 
{ 
    char s[]="STACKOVERFLOW";
    char s1[200];
    printf("Enter the string to be checked\n");//enter the input string
    scanf("%s",s1);
    if(strcmp(s,s1)==0)//compare both the strings  
    {
        printf("Both the Strings match\n"); 
    } 
    else
    {
        printf("Entered String does not match\n");  
    } 
    system("pause");  
} 

0

আমি স্ট্রিংগুলি কীভাবে তুলনা করব?

char input[40];
char check[40];
strcpy(input, "Hello"); // input assigned somehow
strcpy(check, "Hello"); // check assigned somehow

// insufficient
while (check != input)

// good
while (strcmp(check, input) != 0)
// or 
while (strcmp(check, input))

কেন check != inputপর্যাপ্ত নয় তা দেখতে আমরা আরও গভীর খনন করি ।

সি তে স্ট্রিং একটি স্ট্যান্ডার্ড লাইব্রেরি স্পেসিফিকেশন।

একটি স্ট্রিং প্রথম নাল অক্ষর দ্বারা সমাপ্ত হওয়া এবং অন্তর্ভুক্ত অক্ষরের একটি সংমিশ্রিত ক্রম।
সি 11 §7.1.1 1

inputউপরে একটি স্ট্রিং নয়inputহয় গৃহস্থালির কাজ অ্যারে 40

বিষয়বস্তু inputএকটি স্ট্রিং হতে পারে ।

বেশিরভাগ ক্ষেত্রে, কোনও অভিশাপে যখন অ্যারে ব্যবহার করা হয়, তখন এটি তার প্রথম উপাদানটির ঠিকানায় রূপান্তরিত হয়।

নীচে রূপান্তরিত হয় checkএবং inputতাদের প্রথম ঠিকানার নিজ নিজ ঠিকানায়, তারপরে সেই ঠিকানাগুলির তুলনা করা হয়।

check != input   // Compare addresses, not the contents of what addresses reference

স্ট্রিংগুলির তুলনা করতে , আমাদের সেই ঠিকানাগুলি ব্যবহার করতে হবে এবং তারপরে তারা যে ডেটা দেখিয়েছে তা সন্ধান করতে হবে।
strcmp()পেশা আছে । §7.23.4.2

int strcmp(const char *s1, const char *s2);

strcmpফাংশন দ্বারা স্ট্রিং তীক্ষ্ন তুলনা s1স্ট্রিং দ্বারা প্রতি ইঙ্গিত s2

strcmpফাংশন আয় চেয়ে একটি পূর্ণসংখ্যা বৃহত্তর, এর সমান বা শূন্য কম, সেই অনুযায়ী স্ট্রিং দ্বারা প্রতি ইঙ্গিত s1বেশী সমান, বা কম স্ট্রিং দ্বারা প্রতি ইঙ্গিত চেয়ে s2

স্ট্রিংগুলি একই ডেটারে রয়েছে কিনা তা কেবল কোডই সন্ধান করতে পারে না, তবে তারা পৃথক হলে কোনটি বৃহত্তর / কম হয়।

স্ট্রিং পৃথক হলে নীচে সত্য।

strcmp(check, input) != 0

অন্তর্দৃষ্টি জন্য, আমার নিজের ফাংশন তৈরি করা দেখুনstrcmp()


-2
    #include<stdio.h>
    #include<string.h>
    int main()
    {
        char s1[50],s2[50];
        printf("Enter the character of strings: ");
        gets(s1);
        printf("\nEnter different character of string to repeat: \n");
        while(strcmp(s1,s2))
        {
            printf("%s\n",s1);
            gets(s2);
        }
        return 0;
    }

এটি খুব সহজ সমাধান যেখানে আপনি নিজের আউটপুটটি আপনার পছন্দ মতো পাবেন।


2
gets();সি 11 এর পরে স্ট্যান্ডার্ড সি এর অংশ নয়।
chux -

2
strcmp(s1,s2)s2প্রথমে বিষয়বস্তু নির্দিষ্ট করা হয়নি বলে ইউবি as
chux -

আপনি যদি কোনও আকারে বা অন্য কোনওভাবে এই স্নিপেটের আউটপুট সরবরাহ করতে পারেন তবে দুর্দান্ত হবে।
not2qubit
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.