Есть ряд проблем с этим.
Вы printf
используете неверную строку формата. Используйте %zu
для size_t
, а не %d
.
Ваш printf
имеет неопределенное поведение, поскольку у вас есть *s
и *s++
в том же выражении, без точки последовательности между ними.
Вы пересчитываете strlen(s)
на каждой итерации цикла, и это значение уменьшается ивниз и вниз, потому что вы продолжаете увеличивать s
.Я бы кешировал strlen(s)
в переменную с именем n
(или что-то подобное) перед началом, так как n
не изменится.
Мой компилятор предупреждал меня обо всем, крометретий баг.
Эта программа работает:
#include <string.h>
#include <stdio.h>
#define bool int
#define true 1
#define false 0
static bool is_digit(char c){
return c > 47 && c < 58;
}
int main(){
const char *s = "123456";
size_t i;
const size_t n = strlen(s);
printf("len = %zu\n", n);
for(i = 0; i<n; ++i){
printf("%c : %s\n", *s, is_digit(*s)? "true" : "false");
s++;
}
return 0;
}
Вы также можете пропустить strlen
полностью и простоищите нулевой терминатор:
#include <string.h>
#include <stdio.h>
#define bool int
#define true 1
#define false 0
static bool is_digit(char c){
return c > 47 && c < 58;
}
int main(){
const char *s = "123456";
while (*s) {
printf("%c : %s\n", *s, is_digit(*s)? "true" : "false");
s++;
}
return 0;
}