2010-02-24 83 views
10

Tôi sắp xếp mảng ô tô theo hai cách. từng năm được hiển thị bên dưới. và một cái khác bằng cách thực hiện. Make là một char * Làm thế nào để so sánh các chuỗi khi tôi chỉ có con trỏ cho họ?C hoặc C++. Làm thế nào để so sánh hai chuỗi cho char * con trỏ?

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]); 
      } 
     } 
    } 
} 

Phương thức trên hoạt động cho int (năm). Làm thế nào tôi có thể làm cho nó làm việc cho char con trỏ?

+1

Trên một lưu ý liên quan: bạn làm biết rằng loại bong bóng là siêu Duper không hiệu quả, phải không? – rlbond

+3

Trên đầu vào rất lớn nó là siêu-duper không hiệu quả. Về kích thước đầu vào nhỏ, nó thực sự có thể nhanh hơn các loại sexy hơn, do nó rất đơn giản để thực hiện. Tất nhiên trên đầu vào nhỏ (như thế này) tốc độ không thực sự là một mối quan tâm anyway. –

+2

Nhưng nếu bạn muốn sắp xếp các đầu vào nhỏ, bạn cũng có thể sử dụng sắp xếp chèn, có hiệu suất trung bình tốt hơn, ngay cả khi nó cũng là O (n^2) – bobDevil

Trả lời

27

Trong một hoặc nhiều, cách là gọi strcmp. Nếu chuỗi của bạn (vì một số lý do lạ) không bị NUL chấm dứt, bạn nên sử dụng strncmp để thay thế.

Tuy nhiên, trong C++ bạn thực sự không nên thao tác chuỗi trong mảng char nếu bạn có thể tránh được nó một cách hợp lý. Sử dụng std::string để thay thế.

+2

Vì bạn sắp xếp, std :: sort là của bạn bạn cũng thế. http://www.cplusplus.com/reference/algorithm/sort/ Tất cả những gì bạn cần cung cấp là một hàm so sánh cho std :: sort để sử dụng. – Carl

13

Tôi nghĩ bạn cần sử dụng hàm strcmp().

2

Đảm bảo rằng char * không rỗng và nếu bạn muốn, hãy tìm hàm stricmp() để so sánh phân biệt chữ hoa chữ thường. Nếu không, sử dụng strcmp().

char * thực sự đại diện cho địa chỉ bộ nhớ của ký tự đầu tiên trong mỗi chuỗi. Vì vậy, bạn không thực sự muốn so sánh các giá trị của con trỏ, nhưng nội dung chúng trỏ đến.

+1

stricmp() không phải là tiêu chuẩn: http://stackoverflow.com/questions/1784767/g-error-stricmp-was-not-declared-in-this-scope-but-ok-for-strcmp Tôi nghĩ đó là Microsoft -riêng. –

+0

Nếu stricmp() không có trong thư viện của bạn, hãy kiểm tra strcmpi() và nếu không có strcasecmp(). Một cái gì đó với chức năng đó sẽ ở đó. –

1

Trong hàm strcmp() của C như đã nêu. Trong C++, bạn có thể sử dụng hàm 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

Uhhh, không bạn không nên sử dụng 'so sánh' ở đây. Đây là điều mà toán tử '==' trên chuỗi là cho. Lý do duy nhất để sử dụng so sánh là khi bạn quan tâm về việc một chuỗi là (theo thứ tự bảng chữ cái) nhỏ hơn hay lớn hơn cái kia. –

+0

@ T.E.D. hàm 'compare' thực hiện một số (giá trị ký tự) thay vì so sánh theo thứ tự bảng chữ cái. I E. một so sánh từ điển của các chuỗi. – davmac

0

Tôi dĩ nhiên giả sử ở đây bạn có char * cho xe làm

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

Bạn muốn so sánh với 0 vì strcmp sẽ trả về 0 nếu không có sự khác biệt giữa hai chuỗi.
strcmp mất hai const char *.
http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

0

Bạn thực sự nên sử dụng qsort (trong C, #include <stdlib.h>) hoặc std::sort (trong C++, #include <algorithm>) thay vì một loại bong bóng như thế này. Nếu đó là C++ và bạn có lời khuyên của @ T.E.D. để sử dụng std::string thay vì chuỗi C thô, bạn thậm chí không phải chỉ định so sánh vì toán tử < sẽ được sử dụng và sẽ làm điều đúng.

0

Khi bạn cần phải so sánh hai con trỏ char đặc biệt, bạn có thể so sánh chúng theo cách thông thường: bằng cách sử dụng toán tử so sánh <, >, ==, vv

Vấn đề ở THS trường hợp là bạn don 't cần so sánh hai con trỏ char. Những gì bạn cần mặc dù, là so sánh hai chuỗi kiểu C những con trỏ char này trỏ đến. Để so sánh các chuỗi kiểu C, bạn phải sử dụng hàm strcmp tiêu chuẩn.

Trên đầu trang của, cách tiếp cận xử lý các phần tử null trong thuật toán sắp xếp của bạn dường như không có ý nghĩa gì. Hãy tưởng tượng một mảng đầu vào có chứa con trỏ null xen kẽ và con trỏ không null. Rõ ràng, thuật toán sắp xếp của bạn sẽ không bao giờ sắp xếp bất kỳ thứ gì, vì điều kiện trong số if của bạn sẽ không bao giờ đúng. Bạn cần xem xét lại việc xử lý các phần tử null của bạn. Tất nhiên, trước hết, bạn phải quyết định làm gì với họ. Bỏ qua và để lại tại chỗ? Đẩy tới một đầu của mảng? Có gì khác?

Các vấn đề liên quan