2016-12-12 10 views
0

strcmp()를 사용하지 않고 두 문자열을 비교하는 프로그램을 작성했습니다. 그러나 원하는 결과를 얻을 수 없습니다. 내 프로그램 코드는 다음과 같습니다.strcmp()에 대한 프로그램의 C 코드에서 잘못된 점은 무엇입니까?

#include<stdio.h> 
int main(int argc, char const *argv[]) { 
    int i,j; 
    char a[90],b[90]; 
    printf("Enter the first string:"); 
    scanf("%s", &a[90]); 
    printf("Enter the second string:"); 
    scanf("%s", &b[90]); 
    for (i = 0; a[i] != '\0' && b[i] != '\0'; i++) { 
     if (a[i] == b[i]) { 
     /* code */ 
     printf("Equal %d \n", a[i]-b[i]); 
continue; 
     } if (a[i] > b[i]) { 
     /* code */ 
     printf("ai is big %d \n", a[i]-b[i]); 
     break; 
     } 
     if (a[i] < b[i]) { 
     /* code */ 
     printf("%d bi is the biggest \n", a[i]-b[i]); 
     break; 
     } 

    } 


    return 0; 
} 

터미널에서 프로그램을 실행하면 컴파일러에서 입력 문자열을 가져온 다음 중지합니다. 나는 그것을 많이 시도했지만 그것을 이해할 수 없다. 누구든지 나를 도울 수 있습니까 ...!

+3

당신이'scanf'에 마지막 요소 뒤에 하나를 전달하여 달성하려고하는거야? 정의되지 않은 동작을 제외하고 ... –

+1

버퍼가 90 개 커집니다. 그러나 버퍼의 파트에 액세스하려면 0부터 시작하는 인덱싱을 사용합니다. 따라서 0부터 89까지 사용해야합니다. 1에서 90이 아닙니다. –

+1

C에 관한 질문에 C++ 태그를 사용하지 마십시오. –

답변

7

첫 번째 배열의 이름은 a이고, a[90]이 아닙니다.

마찬가지로 두 번째 배열의 이름은 b[90]이 아니라 b입니다.

ab 끝 부분의 뒤에 하나의 요소 인 a[90]b[90]이 있습니다.

그래서, &a[90]을 쓰기로 &b[90] 당신은 를 작성 scanf를 지시하는 단지 매우 나쁜 잘못 각 배열, 후.

아마 &a[0]&b[0]을 의미할까요?

그러나 scanf은 매우 위험하므로 전혀 사용하지 않아야합니다.

+0

Thnxxx 실수가 있습니다. –

0

표현식 '& a [90]'과 '& b [90]'은 각각 배열 a와 b에서 마지막 항목의 주소를 생성합니다. 즉, 문자열을 배열이 아닌 할당되지 않은 스택 메모리로 읽는 중입니다. scanf() 호출에서 보통 'a'와 'b'만 사용하면됩니다.

"이제 scanf가 문자열을 90 자로 제한하는 법을 알고 있습니까?"라는 궁금증이 생기면 그 해답은 IT가 할 일이 아닙니다. Scanf는 호출자가 입력 된 문자열 (null-char 종료 포함)에 충분한 버퍼 공간을 제공했다고 가정합니다. 임의로 긴 문자열을 입력 할 수 있어야하는 경우 더욱 정교한 버퍼 관리를 수행해야합니다. 90 자 미만의 문자 만 입력하려면 한 번에 한 문자 씩 내려야합니다 (그리고 줄 바꾸기를 명시 적으로 확인해야한다고 생각합니다). 버퍼 오버 플로우.

+0

'& a [90]'은 실제로 마지막 요소가 아닌'a' 배열의 끝을지나 포인터 *로 평가됩니다. 비슷하게'& b [90]'. 'scanf()'가 문자열의 크기를 제한하는 방법에 관해서는 형식 문자열의 필드 기술자 (예 : "% 89s")의 너비 구성 요소를 통해 문자열을 전달할 수 있습니다. 너는 너비를 지정하지 않으면'scanf()'가 알지 못한다. 이것은 중요한 포인트입니다. –

+1

_ "& a [90] '과'& b [90] '표현식은 각각 배열 a와 b의 마지막 항목의 주소를 생성합니다."_ 아니요. –

+0

'scanf ("% s")'scanf ("% 89s")''('% n'을 사용하여 공간이 부족한 지 검사하고 싶을지라도)'fgets()'(그러나'gets()'는 안됨)'include' (POSIX.1-2008 시스템에서)'scanf ("% ms")'. 운이 좋다면 –

0

해당 코드에 문제가 있습니다.

문제

1 사용하지 않은 변수 j.

2 사용자로부터 문자열을받는 동안 scanfa[90]b[90]에 문자열이 90 번째 배열 색인에서 저장된다는 의미입니다. 이로 인해 메모리 문제가 발생할 수 있으며 결과물에 쓰레기 값이 생깁니다.

a[0]b[0]scanf에 사용하는 것이 좋습니다. 배열 이름이 배열의 시작 주소를 가리키는 것처럼 scanf에 배열 이름을 사용할 수 있습니다.

scanf ("%s", a); 

scanf ("%s", b); 

올바른 코드 :

#include "stdio.h" 

int main(int argc, char const *argv[]) 
{ 

     int i; 
     char a[90],b[90]; 
     printf("Enter the first string:"); 
     scanf("%s", a); 
     printf("Enter the second string:"); 
     scanf("%s", b); 
     for (i = 0; a[i] != '\0' || b[i] != '\0'; i++) { 
       if (a[i] == b[i]) { 
         /* code */ 
         printf("Equal %d \n", a[i]-b[i]); 
         continue; 
       } if (a[i] > b[i]) { 
         /* code */ 
         printf("a is big %d \n", a[i]-b[i]); 
         break; 
       } 
       if (a[i] < b[i]) { 
         /* code */ 
         printf("%d b is the biggest \n", a[i]-b[i]); 
         break; 
       } 

     } 
     return 0; 
} 
+0

'a [90]'은 쓰레기 값을 발생시킵니다. 이것은 정의되지 않은 동작입니다. 또한 'a'는 'a'의 첫 번째 요소의 주소가 아니라 'a'의 첫 번째 요소의 주소로 쇠퇴합니다. '& a [0]'은'char'에 대한 포인터이고'a'는이 값으로 감쇠합니다. '& a'는'char (char *) [90]'타입의'char' 배열에 대한 포인터입니다. 아마도 이것은 당신이 의미 한 바 였지만 이것은 더 분명했을 것입니다. –