patterncModerate
Printing the contents of a string array using pointers
Viewed 0 times
thearraycontentsprintingusingpointersstring
Problem
I'm currently studying C and I'm trying to just print the contents of a string array. I'm using
A more proper approach would use this pointer, get a char* each time and use
This code kind of works (prints each letter and then new line). How would you make it better?
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
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?
Solution
Given that the code is really simple, I see mostly coding style issues with it.
Instead of this:
I would prefer either of these writing styles:
The
Instead of the
This maybe a matter of taste,
but I don't think the Hungarian notation like
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
You should declare variables in the smallest scope where they are used.
For example
In C99 and above, the loop variable can be declared directly in the
The last
The compiler will insert it automatically and make the
Putting it together:
Actually it would be more interesting to use
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");
}
}Code Snippets
char *names[] = {
"John", "Mona",
"Lisa", "Frank"
};char *names[] = { "John", "Mona", "Lisa", "Frank" };
// or
char *names[] = {
"John",
"Mona",
"Lisa",
"Frank"
};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");
}
}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");
}
}Context
StackExchange Code Review Q#71119, answer score: 11
Revisions (0)
No revisions yet.