Перебор строки звучит как простая задача, но каждый раз, когда мне приходится это делать, я сталкиваюсь с другим способом. Это будет коллекция различных способов и того, как они работают.


Скобки


For-Loop

Определяем длину строки с помощью strlen(str) и получить доступ к каждому символу строки с помощью скобки 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]);
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

Не забудьте разместить strlen() вне условия цикла for, иначе он будет вызываться на каждой итерации.


Пока-цикл

Мы также можем не определять длину строки заранее и просто перебирать строку, пока не достигнем конца, обозначенного нулевым ограничителем. \0.

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

while (str[i] != '\0')
{
  printf("%c", str[i]);
  i++;
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

Кроме того, условие цикла while может быть сведено к str[i]так как любое значение, отличное от нуля, оценивается как истинное.

while (str[i])
{
  printf("%c", str[i]);
  i++;
}
Войти в полноэкранный режим

Выйти из полноэкранного режима


Указатель


For-Loop

Доступ к первому символу строки с помощью скобок str[0] соответствует *str и доступ ко второму символу через str[1] соответствует *(str+1) или же *++str. Чтобы избежать изменения исходного указателя *strмы копируем его во временный указатель *p и увеличивайте этот указатель на каждой итерации с помощью *++p. Это сочетание ++p а также *p.

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

for (char c = *p; c != '\0'; c = *++p)
{
  printf("%c", c);
}
Войти в полноэкранный режим

Выйти из полноэкранного режима


Пока-цикл

Это в основном то же самое, что и цикл for, но доступ к символу с помощью *c и увеличение указателя разделены.

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

while (*c != '\0')
{
  printf("%c", *c);
  c++;
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

Поскольку мы печатаем символ только с printf()мы можем объединить доступ и приращение в выражение *++c и передать его printf().

while (*c != '\0')
{
  printf("%c", *++c);
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

Подобно записи в скобках, условие для цикла while может быть сокращено до *c.

while (*c)
{
  printf("%c", *++c);
}
Войти в полноэкранный режим

Выйти из полноэкранного режима


Обсуждение

Вероятно, есть много других способов перебора строки C и много веских причин, по которым следует выбирать реализацию. Если у кого-то есть другой вариант или комментарий, я был бы рад изучить его и добавить в этот пост.