Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

2D array using strings

Tags:

arrays

c

string

I'm stuck on some homework which isn't graded (its meant for practice).

I have to create a function called find_name that takes 2 arguments. The first argument is a 2D array of names (strings), and the second is a character string which is used to find the name in the 2D array, the function must return 1 if found else 0.

When i call the function (which is empty right now), I get this warning: passing argument 1 of 'find_name' from incompatible pointer type

Here is the important bits.

In Main

 char strNameList[][2] = { { "Luca","Daniel"} ,{"Vivan","Desmond"},{"Abdul","Justin"}, {"Nina","Marlene"},{"Donny","Kathlene"} };

char strFindName[] = "\0";
    printf("Please enter a name to look for: ");
    gets(strFindName);
    nSearch = find_name(strNameList, strFindName);

The Function

int find_name(char strNameList[][2], char strLookUp[])

I'm new to C (I'm a student), and I'm completely confused about strings (string arrays etc).

like image 879
Luca Tenuta Avatar asked Nov 21 '12 20:11

Luca Tenuta


People also ask

Is an array of strings a 2D array?

A string is a 1-dimensional array of characters and an array of strings is a 2-dimensional array of characters.

How do you declare a 2D string array in C++?

You can declare a multidimensional array of strings like this: std::string myArray[137][42];

How do you read a 2D string array in Java?

Within this loop read each line trim and split it using nextLine(), trim(), and split() methods respectively. Create the second loop starting from 0 up to the length of the line. Within this loop convert each element of the string array to integer and assign to the array created in the previous step.


3 Answers

I'm assuming you want a 2D array of char pointers. Your declaration of strNameList is incorrect in both locations in your program. You have:

char strNameList[][2] = { { "Luca","Daniel"} ,{"Vivan","Desmond"},{"Abdul","Justin"}, {"Nina","Marlene"},{"Donny","Kathlene"} };

But char[][N] is declaring a 2D array of chars, not char* Therefore you're being warned by the compiler you're assigning a raft of pointer values to items of type char

Change both your declarations (your variable and your function parameter) to:

const char *strNameList[][2]

which declares an array of unknown length of arrays of two char*, which now matches your initialization lists. Also, the const is added because (a) I'm assuming you are not planning on modify that name list in your function, and (b) writable string literal declarations assigned to char* via initializer is undefined behavior in C, and officially deprecated in C++, so you should not be using it regardless. Likewise, your lookup-name is probably not being modified either, so also declare it const.

Result:

const char * strNameList[][2] = { 
    {"Luca","Daniel"} ,
    {"Vivan","Desmond"},
    {"Abdul","Justin"}, 
    {"Nina","Marlene"},
    {"Donny","Kathlene"} 
};

and in your function:

int find_name(const char * strNameList[][2], const char strLookUp[])

Last but certainly not least, unless you have a crystal ball your find_name() function has no way of knowing with the given information how many names are in the name list being passed. I'd rather you see this now rather than wonder what happened later. you need to either (a) terminate the list with a token-value that find_name() knows about, or (b) pass the number of names in the list to find_name(). To each their own, but I prefer the latter of these:

int find_name(const char * strNameList[][2], size_t nNameListSize, const char strLookUp[])

and invoke it on your caller side by:

find_name(strNameList, sizeof(strNameList)/sizeof(strNameList[0]), strFindName)
like image 96
WhozCraig Avatar answered Oct 03 '22 11:10

WhozCraig


Do it this way:

#define STOPPER_NAMELIST NULL

char * strNameList[][2] = { 
  { "Luca","Daniel"},
  {"Vivan","Desmond"},
  {"Abdul","Justin"}, 
  {"Nina","Marlene"}, 
  {"Donny","Kathlene"} 
  {STOPPER_NAMELIST, STOPPER_NAMELIST}
};

size_t sizeNameList(const char * strNameList[][2])
{
  size_t size = 0;

  while ((strNameList[size][0] != STOPPER_NAMELIST) && 
         (strNameList[size][0] != STOPPER_NAMELIST))
    ++ size;

  return size;
}

int find_name(char * strNameList[][2], char strLookUp[])
{
   size_t size = sizeNameList(strNameList);

   ...
}

...

nSearch = find_name(strNameList, strFindName);

This approach uses an open array ([]) of char * arrays with 2 entries.


Update:

You could add a stopper element to the array carring the names, then there is no need to pass around the array's size along with array itself, as the size could alway be determined by scanning the array members until the stopper is found.

like image 21
alk Avatar answered Oct 03 '22 13:10

alk


Your function find_name() is looking for a 2-D array of characters ie:

char arr[][2] = { { 'a', 'b'}, ...

if you want to make them strings you need:

char *arr[][2] = { {"John", "Smith"}, ...

Then in the function parameter list you need:

void find_name(char *something[][2])
{
   printf("first name: %s, second name: %s\n", something[0][0], something[0][1]);

And in your main() function call it just by:

find_name(arr);
like image 29
Mike Avatar answered Oct 03 '22 11:10

Mike