How would I compare two char arrays in an array of structs

Hi experts, quick general question. How would I go about comparing to char arrays from an array of structs, and sorting the structs in the array accordingly? (In this case alphabetical order).

 I have tried compare(), but I get an error telling me there is an error for request of member of the struct I am trying to access.

Thanks for the help!
pacman32689Asked:
Who is Participating?
 
Jaime OlivaresConnect With a Mentor Software ArchitectCommented:
I think you mean:
strcmp(contact[i].name,contact[i+1].name)
is it?
0
 
josgoodCommented:
A struct is the same as a class, except that a struct's data is public by default.  So a struct can contain methods.

I suggest a comparison method which is a member of the struct.  The comparison method would take a char array and compare to the char array which is also a member of the struct.
0
 
pacman32689Author Commented:
here was my initial attempt
if( contact[i+1].name.compare(contact.name[i]) == -1)

Open in new window

0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
Jaime OlivaresSoftware ArchitectCommented:
strcmp() will do the job, but the sorting algorithm is another story. I will elaborate in a moment.
0
 
Infinity08Connect With a Mentor Commented:
You can use the STL sort :

        http://www.cplusplus.com/reference/algorithm/sort.html

Something like :


#include <algorithm>
#include <string.h>
 
using namespace std;
 
struct MyStruct {
  // ...
  char name[16];
};
 
bool myStructCompare(MyStruct a, MyStruct b) {
  return (strcmp(a.name, b.name) < 0);
}
 
int main(void) {
  MyStruct array[10];
 
  // fill the array ...
 
  sort(&(array[0]), &(array[9]), myStructCompare);
 
  return 0;
}

Open in new window

0
 
Jaime OlivaresSoftware ArchitectCommented:
qsort() will be the shortest method. first define a comparison function, there you will use the strcmp() function:

#include <stdlib.h>
int comparefn(const void *a, consr void *b){
   return strcmp((struct yourstruct *)a)->name, ((struct yourstruct *)b)->name);
}

then you can use qsort, using the new function as a callback:
qsort(arrayOfStruct,sizeof(arrayOfStruct)/sizeof(structType),sizeof(structType),comparefn);
0
 
Jaime OlivaresSoftware ArchitectCommented:
using your code of previous questions, should be:

#include <stdlib.h>
int comparefn(const void *a, consr void *b){
   return strcmp((struct yourstruct *)a)->name, ((struct yourstruct *)b)->name);
}

then you can use qsort, using the new function as a callback:
qsort(contact,sizeof(contact)/sizeof(struct contactParameter),sizeof(struct contactParameter),comparefn);

notice my solution uses directly the char arrays (name), and doesn't require STL functions.
0
 
Infinity08Commented:
>> and doesn't require STL functions.

You say that like it's a bad thing. It's not ... STL is the standard template library, and is part of C++ ... not using it is passing up on a great tool.
0
 
Jaime OlivaresSoftware ArchitectCommented:
I would suggest to use STL functions, if the struct has STL objects, but it is not the case.
I always try to avoid mixing libraries as far as possible.
0
 
pacman32689Author Commented:
Would this not work?
 strcmp(contact.name[i],contact.name[i+1])

Open in new window

0
 
pacman32689Author Commented:
Yes, thanks so much, it compiled!
0
 
Infinity08Commented:
>> Would this not work?

If name is an array of strings, yes, but I suspect that name is a string (array of characters), so you just do :

        strcmp(contact[i].name, contact[i+1].name)

to compare the name of contact i with the name of contact i + 1.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.