2010-02-24 3 views
10

나는 내 차 배열을 두 가지 방법으로 정렬하고있다. 아래에 표시된 해마다 하나씩. 다른 하나는 제작자가 작성합니다. Make is a char * 포인터를 가지고있을 때 문자열을 비교하는 방법은 무엇입니까?C 또는 C++. char * 포인터가 주어진 두 문자열을 비교하는 방법?

int i, j; 
for(i=0; i<100; i++){ 
    for(j=0; j<100-i; j++){ 
     if(carArray[i]!=NULL && carArray[j]!= NULL && carArray[j+1]!=NULL){ 
      if(carArray[i]->year > carArray[j+1]->year){ 
       swap(carArray[j], carArray[j+1]); 
      } 
     } 
    } 
} 

위의 방법은 int (연도)에서 작동합니다. char 포인터에 대해 어떻게 작동시킬 수 있습니까?

+1

을 비교하는 데 도움이 될 것입니다 : 당신이 알고 그 거품 정렬 오른쪽 슈퍼 괜 찮 비효율적이다? – rlbond

+3

매우 큰 입력의 경우 매우 효율적입니다. 작은 입력 크기에서는 실제로 구현하기가 쉽기 때문에 더 섹시한 정렬보다 더 빠를 수 있습니다. 물론 작은 입력 (이 경우처럼)에서는 속도가 실제로 걱정거리가 아닙니다. –

+2

그러나 작은 입력을 정렬하려면 O (n^2) 인 경우에도 더 나은 평균 성능을 가진 삽입 정렬을 사용할 수 있습니다. – bobDevil

답변

27

어느 쪽이든 거의 에서strcmp으로 전화 할 것입니다. 너의 문자열 (이상한 이유로)이 NUL로 끝난 것이 아니라면 strncmp을 대신 사용해야한다.

그러나 C++에서는 합리적으로 피할 수 있다면 char 배열의 문자열을 조작해서는 안됩니다. 대신 std::string을 사용하십시오.

+2

정렬 할 것이므로 std :: sort는 친구도. http://www.cplusplus.com/reference/algorithm/sort/ 제공해야 할 것은 std :: sort를 사용할 비교 함수입니다. – Carl

13

strcmp() 함수를 사용해야한다고 생각합니다.

2

char *가 null이 아니고 원하는 경우 대/소문자를 구분하지 않는 stricmp() 함수를 찾습니다. 그렇지 않으면 strcmp()를 사용하십시오.

char *는 실제로 각 문자열의 첫 번째 문자의 메모리 주소를 나타냅니다. 따라서 포인터의 값을 비교하고 싶지는 않지만 포인터가 가리키는 내용을 비교하려고합니다.

+1

stricmp()는 표준이 아닙니다. http://stackoverflow.com/questions/1784767/g-error-stricmp-was-not-declared-in-this-scope-but-ok-for-strcmp Microsoft -특유한. –

+0

stricmp()가 라이브러리에 없으면 strcmpi()와 strcasecmp()도 없는지 확인하십시오. 그 기능을 가진 어떤 것이있을 것입니다. –

1

C에서 strcmp() 함수는 이미 설명한 바와 같습니다. C++에서는 compare() 함수를 사용할 수 있습니다.

C :

char str1[10] = "one"; 
char str2[10] = "two"; 

if (strcmp(s, t) != 0) // if they are equal compare return 0 

C++

string str1 ("one"); 
string str2 ("two"); 
if (str1.compare(str2) != 0) // if they are equal compare return 0 
+0

어, 아니, 여기서 '비교'해서는 안됩니다. 이것은 문자열에있는'=='연산자가 사용하는 것입니다. 비교를 사용하는 유일한 이유는 한 문자열이 다른 알파벳보다 (알파벳순으로) 작거나 큰지에 대해 걱정할 때입니다. –

+0

@ T.E.D. 'compare' 함수는 알파벳 비교보다는 숫자 (문자 값)을합니다. 나는. 문자열의 사전 식 비교. – davmac

0

나는 물론 차에 대한 * 당신이 문자가 여기 가정의이야가

int i, j; 
for(i=0; i<100; i++){ 
    for(j=0; j<100-i; j++){ 
     if(carArray[i]!=NULL && carArray[j]!= NULL && carArray[j+1]!=NULL){ 
      if(strcmp(carArray[i]->make, carArray[j+1]->make) == 0) 
      { 
       //Do whatever here 
      } 
     } 
    } 
} 

당신은 0에 대해 비교할 수 있기 때문에 strcmp는 두 문자열간에 차이가 없으면 0을 반환합니다.
strcmp는 두 개의 const char *를 사용합니다.
http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

0

당신은 정말 대신이 같은 버블 정렬 (C++, #include <algorithm>에) 또는 std::sort (C, #include <stdlib.h>에서) qsort를 사용해야합니다. C++이고 원시 C 문자열 대신 std::string을 사용하기 위해 @ T.E.D.의 조언을 듣는 경우 < 연산자가 사용되고 올바른 작업을 수행하므로 비교를 지정하지 않아도됩니다. 특별히 두 문자 포인터을 비교해야하는 경우

0

, 당신은 일반적인 방법으로 그들을 비교할 수 있습니다 비교 연산자 <, >을 사용하여 ==

THS 경우 문제는 당신 은 두 개의 char 포인터를 비교해야합니다. 하지만 당신이해야 할 일은 두 개의 C 스타일 문자열을 가리키는 이러한 char 포인터를 비교하는 것입니다. C 스타일 문자열을 비교하려면 표준 strcmp 함수를 사용해야합니다.

이외에도 정렬 알고리즘에서 null 요소를 처리하는 방법은 아무런 의미가없는 것 같습니다. 번갈아 나타나는 널 포인터와 널 포인터가 아닌 입력 배열을 상상해보십시오. if의 조건은 결코 사실이 아니므로 정렬 알고리즘이 아무 것도 정렬하지 않는다는 것은 명백합니다. null 요소에 대한 처리를 다시 고려해야합니다. 물론, 무엇보다 먼저 그들과 함께해야 할 일을 결정해야합니다. 무시하고 제자리에 두십시오. 배열의 한쪽 끝으로 밀어 넣으시겠습니까? 다른 사람?

관련 문제