2013-04-14 2 views
-1

문자열 기능을 사용하지 않고 어떤 문자열의 길이가 더 큰지 확인하는 프로그램을 작성하고 싶습니다. 나는 gets()을 사용하여 두 개의 문자열을 입력하려고했지만 내 프로그램은 계속 충돌합니다. 도와주세요! 감사! 여기 C에서 gets()를 사용하여 문자열을 가져올 수 없습니다

내 코드입니다 : 두 번째 while 루프에서

#include <stdio.h> 
int l1,l2; 
char *st1,*st2; 
void accept() 
{ 
    gets(st1); 
    gets(st2); 
} 
void length() 
{ 
    int i = 0; 
    while (st1[i] != '\0') 
    { 
     l1++; i++; 
    } 
    i = 0; 
    while (st2[i] != '\0') 
    { 
     l1++; i++; 
    } 

} 
int main() 
{ 
    accept(); 
    length(); 
    if (l1 > l2) 
     printf("String #1 is greater in length.\n"); 
    else 
     printf("String #2 is greater in length.\n"); 
} 
+0

st1 및 st2는 아무 것도 가리 키지 않습니다. – wildplasser

+0

이 코드는 경고없이 컴파일됩니까? 오류가 발생하지 않고 실행됩니까? –

+3

모든 맨 페이지 중 내가 가장 좋아하는 인용구가 있습니다 : "** gets()를 사용하지 마십시오. **" "안전하게 사용할 수 없으므로. –

답변

4

당신이 st1 또는 st2에 공간을 할당하거나 당신이 그들을 초기화하지 않은 ... 그래서 그들은이다 둘 다 메모리에있는 알려지지 않은 장소를 가리킨다. 말했다

char st1[1024]; 
char st2[1024]; 

gets 오버런 공격을 버퍼 될 수 있습니다로 본질적으로 안전하지 않은 것을 깨닫게 ... 시도; 누군가가 1024보다 긴 문자열을 입력하고 프로그램을 중단하는 것을 막을 수있는 방법은 없습니다. 다음과 같이도 크게 길이() 함수를 단순화 할 수

...

void length() 
{ 
    for (l1 = 0; st1[l1] != '\0'; l1++); 
    for (l2 = 0; st2[l2] != '\0'; l2++); 
} 

이와 gets()에 대한 대안 기능에 대한 질문에 확장은, 대답은 fgets() 같은 것을 사용하는 것입니다 -에 대한 예 ...
int main(int argc, char** argv) 
{ 
    if(fgets(st1, sizeof(st1), stdin) != NULL) 
    { 
     if(fgets(st2, sizeof(st2), stdin) != NULL) 
     { 
      length(); 

      if (l1 > l2) printf("String #1 is greater in length.\n"); 
      else if (l2 > l1) printf("String #2 is greater in length.\n"); 
      else printf("Both strings are the same length.\n"); 
     } 
     else printf("could not read second string\n"); 
    } 
    else printf("could not read first string\n"); 

    return(0); 
} 

이 경우, fgets()는 사용자가 st1 또는 st2 오버 플로우를 허용하지 않습니다 그리고 그것은 그들이 종료 문자열을 항상를 null로되어 있는지 확인합니다.

+0

도움 주셔서 감사합니다! – Shail

1

사용 l2,

l1=0; 
    while (st1[l1] != '\0') 
    { 
     l1++; 
    } 
    l2 = 0; 
    while (st2[l2] != '\0') 
    { 
     l2++; 
    }