How To Iterate Over C String

Chris Cook - Nov 7 '22 - - Dev Community

Iterating over a string sounds like a simple task, but every time I have to do it, I come across a different way. This will be a collection of different ways and how they work.

Brackets

For-Loop

We determine the length of the string with strlen(str) and access each character of the string with the bracket str[i].

char *str = "This is an example.";
size_t length = strlen(str); 

for (size_t i = 0; i < length; i++)
{
  printf("%c", str[i]);
}
Enter fullscreen mode Exit fullscreen mode

Remember to place strlen() outside the for loop condition, otherwise it will be called on each iteration.

While-Loop

We can also avoid determining the length of the string in advance, and simply iterate over the string until we reach the end indicated by a null terminator \0.

char *str = "This is an example.";
size_t i = 0; 

while (str[i] != '\0')
{
  printf("%c", str[i]);
  i++;
}
Enter fullscreen mode Exit fullscreen mode

Furthermore, the condition of the while loop can be reduced to str[i], since any value that is not zero is evaluated as true.

while (str[i])
{
  printf("%c", str[i]);
  i++;
}
Enter fullscreen mode Exit fullscreen mode

Pointer

For-Loop

Accessing the first character of the string with brackets str[0] corresponds to *str and accessing the second character via str[1] corresponds to *(str+1) or *++str. To avoid modifying the original pointer *str, we copy it to a temporary pointer *p and increment this pointer at each iteration with *++p. This is the combination of ++p and *p.

char *str = "This is an example.";
char *p = str;

for (char c = *p; c != '\0'; c = *++p)
{
  printf("%c", c);
}
Enter fullscreen mode Exit fullscreen mode

While-Loop

This is basically the same as the for loop, but accessing the character with *c and incrementing the pointer are separated.

char *str = "This is an example.";
char *c = str;

while (*c != '\0')
{
  printf("%c", *c);
  c++;
}
Enter fullscreen mode Exit fullscreen mode

Since we only print the character with printf(), we can combine the access and increment into an expression *++c and pass it to printf().

while (*c != '\0')
{
  printf("%c", *++c);
}
Enter fullscreen mode Exit fullscreen mode

Similar to the brackets notation, the condition for the while loop can be reduced to *c.

while (*c)
{
  printf("%c", *++c);
}
Enter fullscreen mode Exit fullscreen mode

Discussion

There are probably many more ways to iterate over a C string, and many good reasons for when to choose which implementation. If anyone has another option or comment, I'd be happy to learn it and add it to this post.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player