Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Почему код ведет себя по разному в зависимости от наличия или отстутствия printf - С

diana minislamova Ученик (192), на голосовании 19 часов назад
Код на С
 #include <stdio.h> 

int main(){
char str[102];
fgets(str, 102, stdin);
int count = 0;
for (int i = 0; i < 101; i++){
if (str[i] != ' ' && str[i + 1] == ' '){
count += 1;
printf("%d ", i);
}
}
printf("\n%d", count);
return 0;
}
Input: " YoungCoder.Ru 2014 - 2024"
Output: "12 17 19"
"3"

 #include <stdio.h> 

int main(){
char str[102];
fgets(str, 102, stdin);
int count = 0;
for (int i = 0; i < 101; i++){
if (str[i] != ' ' && str[i + 1] == ' '){
count += 1;
}
}
printf("\n%d", count);
return 0;
}
Input: " YoungCoder.Ru 2014 - 2024"
Output: "4"

Входные данные одинаковы, результаты отличаются на единицу. Код отличается только наличием printf()
Почемутак?
Дополнен 1 месяц назад
#include <stdio.h>

int main(){
char str[102];
fgets(str, 102, stdin);
int count = 0;
for (int i = 0; i < 101; i++){
if (str[i] != ' ' && str[i + 1] == ' '){
count += 1;
printf("%d ", i);
}
}
printf("\n%d", count);
return 0;
}

#include <stdio.h>

int main(){
char str[102];
fgets(str, 102, stdin);
int count = 0;
for (int i = 0; i < 101; i++){
if (str[i] != ' ' && str[i + 1] == ' '){
count += 1;
}
}
printf("\n%d", count);
return 0;
}
Голосование за лучший ответ
АI Мыслитель (8611) 1 месяц назад
Это классический случай неопределенного поведения в C, связанного с порядком вычисления аргументов функции и побочными эффектами.
etar125 Гуру (4871) 1 месяц назад
А код где?
Из-за простого printf меняться результат не может.
diana minislamovaУченик (192) 1 месяц назад
Дополнил ответ двумя вариантами кода с printf и без. Почему то когда писал вопрос код удалился
etar125 Гуру (4871) diana minislamova, у меня результат одинаковый.
Андрей Высший разум (472599) 1 месяц назад
Всё просто: ты в цикле просматриваешь НЕ введённую строку, а весь буфер str. Но находящаяся после введённой строки часть str содержит произвольный мусор и этот мусор ты тоже просматриваешь. При запуске первого варианта кода в этом мусоре не оказалось ни одной последовательности байт с кодами [(любой отличный от 0x20), (0x20)] и программа вывела 3. При запуске второго варианта кода в этом мусоре одна такая последовательность нашлась и программа вывела 4.
Похожие вопросы