I’m currently studying C and I’m trying to just print the contents of a string array. I’m using
pNames
to point to the first char pointer and iterating from there.A more proper approach would use this pointer, get a char* each time and use
printf("%s", pNames[i])
to print a whole string. However, I thought I would try to print it character-by-character inside each string, as follows:#include <stdio.h> int main(int argc, char *argv[]) { char *names[] = { "John", "Mona", "Lisa", "Frank" }; char **pNames = names; char *pArr; int i = 0; while(i < 4) { pArr = pNames[i]; while(*pArr != '\0') { printf("%c\n", *(pArr++)); } printf("\n"); i++; } return 0; }
This code kind of works (prints each letter and then new line). How would you make it better?
Answer
Given that the code is really simple, I see mostly coding style issues with it.
Instead of this:
char *names[] = { "John", "Mona", "Lisa", "Frank" };
I would prefer either of these writing styles:
char *names[] = { "John", "Mona", "Lisa", "Frank" };
// or
char *names[] = {
"John",
"Mona",
"Lisa",
"Frank"
};
The pNames
variable is pointless. You could just use names
.
Instead of the while
loop, a for
loop would be more natural.
This maybe a matter of taste,
but I don’t think the Hungarian notation like *pArr
is great.
And in any case you are using this pointer to step over character by character,
so “Arr” is hardly a good name.
I’d for go for pos
instead. Or even just p
.
You should declare variables in the smallest scope where they are used.
For example *pos
would be best declared inside the for
loop.
In C99 and above, the loop variable can be declared directly in the for
statement.
The last return
statement is unnecessary.
The compiler will insert it automatically and make the main
method return with 0 (= success).
Putting it together:
int main(int argc, char *argv[])
{
char *names[] = { "John", "Mona", "Lisa", "Frank" };
for (int i = 0; i < 4; ++i) {
char *pos = names[i];
while (*pos != '\0') {
printf("%c\n", *(pos++));
}
printf("\n");
}
}
Actually it would be more interesting to use argc
and argv
for something:
int main(int argc, char *argv[])
{
for (int i = 1; i < argc; ++i) {
char *pos = argv[i];
while (*pos != '\0') {
printf("%c\n", *(pos++));
}
printf("\n");
}
}
Attribution
Source : Link , Question Author : Michael , Answer Author : janos