Семейство scanf. Баг libc или нет? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Начнем с примера:
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
  int count = 0;
  float f = 0.0f;
  count = scanf("%f", &f);
  printf("Value = %f, count = %d\n", f, count);
  getchar();
  return 0;
}
Сборка:
CC=gcc
CFLAGS=-c -std=c89 -Wall -Wextra
all: test.exe

test.exe: main.o
	$(CC) main.o -o $@

main.o: main.c
	$(CC) $(CFLAGS) main.c -o $@
Подадим на вход строку
3e
Получим на выходе:
Value = 3.0000, count = 1
Версия 4.8.1. Вопрос, почему оно работает? Ведь по стандарту (6.4.4.2) то, что мы ввели не является действительной константой. Вдобавок, в разделе про fscanf (7.19.6.2 п. 19, 20) четко указано, что в данном случае функция должна была вернуть ноль. ЗЫ, видел в багзилле аналогичный баг на glibc, но там вообще неясно чем кончилось.
ЗЫЫ, что забавно, сильно мной нелюбимый xlc ведет себя как надо (т.е. 0.0 и 0 на stdout).

Решение задачи: «Семейство scanf. Баг libc или нет?»

textual
Листинг программы
% tcc -run test.c
12zzzz
Value = 12.000000, count = 1

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5