I know how to make string array using a two dimensional array but can I do something like this:
char array[];
array[1]="bob";
array[2]="cat";
I know how to make string array using a two dimensional array but can I do something like this:
char array[];
array[1]="bob";
array[2]="cat";
Yes, but not the way you're trying to do it.
For example, you could do this:
char arr[] = "bob\0cat";
arr
contains two strings, "bob"
starting at arr[0]
and "cat"
starting at arr[4]
. This isn't particularly convenient, since you have to traverse the array to find the strings, but it does use memory efficiently.
Each element of arr
is a single char
, so you can't store a string in each element, but you can store multiple strings consecutively.
There are other ways to store lists of strings. The most common is to define an array of char*
pointers, with each pointer pointing to (the first character of) a string that's been allocated elsewhere. The argv
parameter of main
is the most common example of this approach.
In your example:
char array[];
This is invalid; if you want to define an array object, you have to specify the number of elements.
array[1]="bob";
array[2]="cat";
These assignments are both invalid. array[1]
and array[2]
are both single char
objects. You can't assign a string to a single char
. Actually the expression "bob"
is implicitly converted to a char*
pointer -- which you still can't assign to a char
object.
If you defined your array
as an array of char*
pointers, those assignments would be valid, and in fact that's the usual way to represent a list of strings:
char *array[2]; /* an array of pointers */
array[0] = "bob";
array[1] = "cat";
The strings themselves are allocated outside the array; the array contains pointers to them. Each pointer actually points to a single char
object, but we can use that pointer to access the entire string.
Yes you can, but you have to use an array of pointers:
#include<stdio.h>
#include<conio.h>
int main()
{
char *ar[]={"one","two","three"};//array of pointer
for(int i=0;i<3;i++)
{
printf("%s\n",ar[i]);
}
}
Yes, possible only if you can imagine the memory as a raw contiguous unit and know exactly what you are doing.
for example,
lets consider a memory block of 25 bytes as below
00 04
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+ 09
| | | | | |
+----+----+----+----+----+ 14
| | | | | |
+----+----+----+----+----+ 19
| | | | | |
+----+----+----+----+----+ 24
| | | | | |
+----+----+----+----+----+ 29
Lets consider my allocation was like this
void *p = malloc( 5 * 5 * sizeof( char ) );
I can access a row of size 5 with pure pointer arithmatic as
for instance lets say I'll copy a string in 3rd row
memcpy ( p+(5*3) , "Hello", 5 );
Only problem is maintaining this raw area is little too complicated than usual, besides there are advantages in usage.
If you're talking about storing pointers to strings, then yes:
const char *strings[SIZE];
strings[0] = "bob";
strings[1] = "cat";
...
Note that we're only storing the addresses of the string literals "bob"
and "cat"
in the strings
array; the contents of the string literals are stored somewhere else.
strings
is declared as an array of const char *
since attempting to modify the contents of a string literal leads to undefined behavior.
If you want to store the contents of multiple strings in a single 1-D array, then you'll need to concatenate them together, something like:
char dest[SIZE] = {0}; // want to make sure at least the first element is 0
strcat( dest, "bob" );
strcat( dest, "cat" );
after which dest
contains the string "bobcat"
, where "bob"
starts at index 0 and "cat"
starts at index 3. Note that you cannot use the =
operator to assign string contents; you must either use a library function like strcat
, or you must assign each character individually, like
dest[0] = 'b';
dest[1] = 'o';
dest[2] = 'b';
...
If you want to keep track of where individual strings begin and end within that 1-D sequence, then you will need to add some sort of delimiter, like
strcat( dest, "bob" );
strcat( dest, "$" );
strcat( dest, "cat" );
giving you the string "bob$cat"
; you could then use strtok
or strchr
to find individual strings in the list of strings.