Mustafa
Mustafa

Reputation: 177

an array of char pointers in c

I want to use an array of char pointers where each pointer in the array is pointing to a char in another char array, therefore, I would be able to print the char array through the pointers.

char city[14] = {'D', 'u', 'b', 'a', 'i'};
char *charPointers[100] = {0};
for(size_t i = 0;city[i] != '\0'; i++)
    charPointers[i] = &city[i];
printf("\ncity = ");
for(size_t i = 0; *charPointers != 0; i++)
    //printf("%c", *(charPointers[i]));
    putchar(*charPointers[i]);

Is charPointers an array of pointers or simply a string ?
If it's a string, then how can I use an array of pointers such that each pointer is pointing to a char?
What's an elegant way to achieve what I want? (preferably using pointer arithmetic)

Upvotes: 2

Views: 1115

Answers (4)

Lundin
Lundin

Reputation: 215245

I want to use an array of char pointers where each pointer in the array is pointing to a char in another char array

Why? There is never a reason why you would want to do this, in real world programming.

therefore, I would be able to print the char array through the pointers

Indeed. That's handy if your program is too fast and too effective.

Is charPointers an array of pointers or simply a string?

It's an array of pointers.

What's an elegant way to achieve what I want?

There is no elegant way to "use an array of char pointers where each pointer in the array is pointing to a char in another char array". This is obfuscation and it fills no purpose except making your code slow and unreadable.

Sane, elegant code would look like this:

const char city [] = {'D', 'u', 'b', 'a', 'i', '\0'}; 

printf("City = ");
print_str(city);

...

void print_str (const char* str)
{
  while(*str != '\0')
  {
    putchar(*str);
    str++;
  }
}

Upvotes: 0

delehef
delehef

Reputation: 761

charPointer is an array of pointers to char. A pointer to an array of char would be char (*p)[100];.

Your code is near correct, here is the not-segfaulting version :

char city[14] = {'D', 'u', 'b', 'a', 'i', '\0'};
char* charPointers[100] = {0};
size_t i =0;
for(i = 0; city[i] != '\0'; i++)
    charPointers[i] = city + i;

charPointers[i] = city + i; // Don't forget to add the \0 at the end !

printf("\ncity = ");
for(i = 0; *charPointers[i] != '\0'; i++)
    printf("%c", *charPointers[i]);

I don't really know what you want to do, but the code above is storing a pointer to each character of the string city in each element of charPointers.

However, if you want to store a pointer to existing string in charPointers (for instance, each element of charPointers points to a city name), here would be the correct code:

char* cityNames[NB_CITY];
char* city = "Dubai";

cityNames[0] = city;
printf("%s\n", cityNames[0]); // gives "Dubai"

Upvotes: 1

Jonathan Leffler
Jonathan Leffler

Reputation: 755054

charPointers is an array of pointers; it is categorically not simply a string.

Since it isn't a string, your second question is moot.

Your loop condition is incorrect; you need to write:

for (size_t i = 0; charPointers[i] != 0; i++)
    //printf("%c", *(charPointers[i]));
    putchar(*charPointers[i]);
putchar('\n');

You're testing whether the first pointer is null; it isn't. You need to check the current pointer on each iteration. The loop below might help you understand what's going on, too:

for (size_t i = 0; charPointers[i] != 0; i++)
    printf("%zd [%s]\n", i, charPointers[i]);

This code:

#include <stdio.h>

int main(void)
{
    char city[14] = {'D', 'u', 'b', 'a', 'i'};
    char *charPointers[100] = {0};
    for(size_t i = 0;city[i] != '\0'; i++)
        charPointers[i] = &city[i];

    printf("city = ");

    for (size_t i = 0; charPointers[i] != 0; i++)
        putchar(*charPointers[i]);
    putchar('\n');

    for (size_t i = 0; charPointers[i] != 0; i++)
        printf("%zd [%s]\n", i, charPointers[i]);

    return 0;
}

produces this output:

city = Dubai
0 [Dubai]
1 [ubai]
2 [bai]
3 [ai]
4 [i]

Upvotes: 1

unwind
unwind

Reputation: 400129

charPointers is clearly an array of pointers to characters. The array city is a string (as pointed out in a comment) since you've specified a length of 14 but only provided 5 actual characters. The rest are set to zero which will terminate the string.

A much clearer way to get the same result would be:

const char *city = "Dubai";

Your loop over *charPointers is strange, since it treats *charPointers as a character, when it's really a pointer.

Perhaps you meant:

for(size_t i = 0; charPointers[i] != NULL; ++i)
  printf("%s\n", charPointers[i]);

Upvotes: 0

Related Questions