Programing

C에서 문자열을 올바르게 비교하려면 어떻게 해야 하는가?

c10106 2022. 4. 18. 19:54
반응형

C에서 문자열을 올바르게 비교하려면 어떻게 해야 하는가?

사용자가 단어나 문자를 입력하여 저장한 후 사용자가 다시 입력할 때까지 인쇄할 수 있도록 프로그램을 구하여 프로그램을 종료하려고 한다.내 코드는 이렇게 생겼어:

#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);   /* obsolete function: do not use!! */
    printf("I will now repeat this until you type it back to me.\n");

    while (check != input)
    {
        printf("%s\n", input);
        gets(check);   /* obsolete function: do not use!! */
    }

    printf("Good bye!");
    

    return 0;
}

문제는 사용자의 입력(체크)이 원본(입력)과 일치해도 입력 문자열의 인쇄를 계속 받는다는 것이다.내가 두 가지를 잘못 비교하고 있는 건가?

다음을 사용하여 문자열을 비교할 수 없음(유용하게)!=또는==, 당신은 사용할 필요가 있다.strcmp:

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

는 그 이다.!=그리고==해당 문자열의 기본 주소만 비교하십시오.현 자체의 내용이 아니다.

몇 가지 예를 들어, 안전하지 않기 때문에 다음으로 교체해야 한다.fgets(input, sizeof(input), stdin)버퍼 오버플로우가 발생하지 않도록.

다음으로, 문자열을 비교하려면strcmp여기서 반환 값 0은 두 문자열이 일치함을 나타낸다.평등 연산자 사용(즉. !=)는 개인과 반대로 두 문자열의 주소를 비교한다.char그들 안에.

그리고 또한 이 예에서는 문제를 일으키지 않지만,fgets'라라인드'의 장,'\n'gets()하지 않다사용자 입력을 비교한 경우fgets()와 같은 문자 그대로"abc"결코 일치하지 않을 것이다(버퍼가 너무 작아져서'\n'어울리지 않을 것이다.

사용하다.

이 안에 있다.string.h도서관, 그리고 매우 인기있다.strcmp문자열이 같으면 0을 반환한다.자세한 내용은 이 항목을 참조하십시오.strcmp돌아온다

기본적으로 다음과 같은 작업을 수행해야 한다.

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

또는

while (!strcmp(check,input))

또는

while (strcmp(check,input))

다음 튜토리얼을 참조하십시오.strcmp.

문자열을 비교하려고 할 때마다 문자열을 각 문자에 대해 비교하십시오.할 수 있으며,인 위해해 strcmp(input1,input2)를 .라는 내장 문자열 함수를 사용할 수 있으며, 헤더 파일인 strcmp(input1,input2)를 사용해야 한다.#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");  
} 

이와 같이 어레이를 직접 비교할 수 없음

array1==array2

이 값을 차별로 비교하십시오. 함수를 사용하여 부울(True:1, False:0) 값을 반환하십시오.그러면 while loop의 테스트 조건에서 사용할 수 있다.

다음을 시도해 보십시오.

#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;
}

포인터 개념에 온 걸 환영해초창기 프로그래머 세대들은 그 개념을 이해하기 힘들다는 것을 발견했지만, 만약 당신이 유능한 프로그래머로 성장하기를 원한다면, 당신은 결국 이 개념을 숙달해야 한다. 게다가, 당신은 이미 올바른 질문을 하고 있다.좋다.

주소가 뭔지 확실히 아십니까?다음 다이어그램을 참조하십시오.

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

다이어그램에서 정수 1은 주소 0x4000의 메모리에 저장된다.왜 주소지?왜냐하면 한 도시가 크고 많은 가족을 수용할 수 있는 것처럼 기억력도 크고 많은 정수를 저장할 수 있기 때문이다.각 정수는 각 가족이 한 집에 거주하기 때문에 기억 위치에 저장된다.각 기억장소는 주소로 식별되며, 각 집은 주소로 식별된다.

다이어그램의 두 상자는 두 개의 뚜렷한 기억 위치를 나타낸다.마치 집인 것처럼 생각하면 된다.정수 1은 주소 0x4000의 메모리 위치에 있다("4000 Elm St"라고 생각한다).정수 7은 주소 0x4004의 메모리 위치에 있다("4004 Elm St"라고 생각한다).

당신은 당신의 프로그램이 1과 7을 비교하고 있다고 생각했지만 그렇지 않았다.0x4000과 0x4004를 비교하고 있었다.그러면 이런 상황이 오면 어떻게 되는 겁니까?

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

두 정수는 같지만 주소가 다르다.당신의 프로그램은 주소를 비교한다.

사용할 필요가 있음strcmp()그리고 당신은 해야 한다.#include <string.h>

!=그리고==연산자는 해당 문자열의 기본 주소만 비교한다.문자열의 내용이 아님

while (strcmp(check, input))

예제 코드:

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

int main()
{
    char input[40];
    char check[40] = "end\n"; //dont forget to check for \n

    while ( strcmp(check, input) ) //strcmp returns 0 if equal
    {
        printf("Please enter a name: \n");
        fgets(input, sizeof(input), stdin);
        printf("My name is: %s\n", input);
    }

    printf("Good bye!");
    return 0;
}

참고1:gets()안전하지 않다.사용하다fgets()대신에

참고2: 사용 시fgets()확인해 볼 필요가 있다.'\n'새 라인 샤렉터도

다음 작업을 수행할 수 있음:

사용하다strcmp()로부터string.h, 어느 것이 더 쉬운 버전인가?

또는 자신의 것을 굴리고 싶다면 다음과 같은 것을 사용할 수 있다.

int strcmp(char *s1, char *s2)
{
    int i;
    while(s1[i] != '\0' && s2[i] != '\0')
    {
        if(s1[i] != s2[i])
        {
            return 1;
        }
        i++;
    }
    return 0;
}

하고 싶다.strcmp()이와 같은 방식으로:

while(strcmp(check, input))
{
    // code here
}
    #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;
    }

이것은 당신이 원하는 대로 당신의 출력을 얻을 수 있는 매우 간단한 솔루션이다.

어떻게 하면 줄을 제대로 비교할 수 있을까?

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))

왜 충분하지 않은지 더 깊이 파보자.

C에서 문자열은 표준 라이브러리 사양이다.

문자열은 첫 번째 null 문자로 종료된 문자의 연속적인 시퀀스다.
C11 §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함수는 이에 따라 문자열이 가리키는 대로 0보다 크거나 같거나 0보다 작은 정수를 반환한다.s1다음이 가리키는 문자열보다 크거나 같거나 작음s2.

코드가 동일한 데이터인지 여부뿐만 아니라 문자열이 다를 때 어떤 문자열이 더 크거나 작은지 확인할 수 있다.

끈이 다를 때는 이하가 맞다.

strcmp(check, input) != 0

자세한 내용은 내 기능 만들기를 참조하십시오.

참조URL: https://stackoverflow.com/questions/8004237/how-do-i-properly-compare-strings-in-c

반응형