#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;
}
static bool is_all_digit(char *s){
while(s){
if (is_digit(*s++)){
continue;
}
return false;
}
return true;
}
int main(){
char *s = "123456";
int i;
printf("len = %d\n", strlen(s));
for(i = 0; i<strlen(s); ++i){
printf("%c : %s\n", *s, is_digit(*s++)? "true" : "false");
//printf("%c : %s\n", s[i], is_digit(s[i])? "true" : "false");
}
return 0;
}
Я хочу реализовать функцию, как прокомментировала часть. Но результат следующий:введите описание изображения здесь
Он заканчивается на 3, а 4~6 исчезают. Моя рабочая среда — win10 gcc 6.3.0.
Пожалуйста, всегда публикуйте выходные данные и сообщения об ошибках в виде текста, так всем будет намного проще.
Вы понимаете, что strlen(s) пересчитывается на каждой итерации и меняется, потому что меняется s?
Дубликат stackoverflow.com/questions/949433/….
@melpomene: Нет, это не дубликат. Хотя код в этом вопросе имеет неопределенное поведение, проблема почти наверняка связана с использованием strlen(s) в управлении циклом и s++ в теле цикла.





С этим возникает ряд проблем.
Вы 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;
}
for(i = 0; i<strlen(s); ++i){
s++;
}
В этом цикле i увеличивается, а strlen(s) уменьшается.
Потому что operator ++ изменяет указатель s; (s++)
Сначала s укажите всю строку «123456»;
Но после одного цикла указатель s перемещается как один байт. Итак s указываем "23456".
Следовательно, strlen(s) теперь возвращает 5.
После того, как напечатано «3», strlen(s) возвращает 3. И i тоже 3.
Так что цикл for завершен.
Выражение *s++ просто означает * «увеличение и разыменование» (Обновлено: «разыменование и увеличение».)
Это поможет: https://en.cppreference.com/w/cpp/language/operator_precedence
Спасибо читать.
Объясните в письменной форме и подробно, какой результат вы получили, какой результат вы ожидали вместо этого, почему и что вы сделали для устранения проблемы. Какие факты вы узнали о своей программе во время отладки?