РЕДАКТИРОВАТЬ : Какую локаль вы используете?
Если вы собираетесь повторять по строке, не беспокойтесь о получении ее длины с strlen
. Просто повторяйте, пока не увидите NUL
символ:
char *p = str;
while(*p != '\0') {
printf("%c\n", *p);
++p;
}
Что касается умноженных символов и тому подобное, они UTF-8? Если строка многобайтовая, вы можете сделать что-то вроде этого:
size_t n = strlen(str);
char *p = str;
char *e = p + n;
while(*p != '\0') {
wchar_t wc;
int l = mbtowc(&wc, p, e - p);
if(l <= 0) break;
p += l;
/* do whatever with wc which is now in wchar_t form */
}
Честно говоря, я не знаю, будет ли mbtowc
просто возвращать -1
, если он встретит NUL
в середине символа MB. Если это произойдет, вы можете просто передать MB_CUR_MAX
вместо e - p
и покончить с вызовом strlen
. Но я чувствую, что это не дело.