2013-05-18 6 views
5

Формат %n спецификатор, при использовании в scanf(), как ожидается, чтобы сохранить подсчет количества символов в строке формата, уже обработанных с помощью функции в качестве аргумента типа int* .Согласно определению:Почему спецификатор формата% n работает нормально для всех операторов scanf(), но сохраняет одно меньше в первом?

The number of characters of the format string already processed is stored in the pointed location.

Но в моей программе он работает так, как и во всех, кроме первого scanf(). Всю мою scanf() s в моей программе, за исключением первой, она хранит счетчик общего количества символов, введенных с консоли, включая новые строки (Введите ключей). Но в первом scanf(), счет один менее общее количество символов и строк, введенных с консоли.

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

#include <stdio.h> 

int main() 
{ 
    int a,b,c,d,count; 

    printf("First Trial\n"); 
    scanf("%d%d%d%d%n",&a,&b,&c,&d,&count); //OUTPUT ANOMALY HERE 
    printf("count=%d\n",count); 

    printf("Second Trial\n"); 
    scanf("%d%n",&a,&count); 
    printf("count=%d\n",count); 

    printf("Third Trial\n"); 
    scanf("%d%d%n",&a,&b,&count); 
    printf("count=%d\n",count); 

    printf("Fourth Trial\n"); 
    scanf("%d%n%d",&a,&count,&b); 
    printf("count=%d",count); 
} 

Пример вывода

First Trial 
253 
34 
4 
83 
count=11 

Second Trial 
25 
count=3 

Third Trial 
234 
38 
count=7 

Fourth Trial 
3534 
35 
count=5 

Почему в первом испытании мы получим "11" вместо «12? Вот мои сомнения.

CRUCIAL EDIT

Другое find.If for first scanf(), вместо использования Enter ключей (новые строки), чтобы отделить введенные числа, если я использую пробел, много пробелов, тогда все эти пробелы подсчитываются также count.Например, я получаю count=21. Это означает, что символы новой строки, пробелы, все рассматривается, но почему это один менее для первого испытания?

First Trial 
25 35 38 98 
count=21 

ответ

7

за исключением первого, он хранит подсчет общего количества введенных символов с консоли, включая символ новой строки (Enter ключи)

Вы неверно истолкованные что. scanf s do не потребляют окончательные символы новой строки, используемые для отправки ввода в программу, поэтому символ новой строки остается в буфере, который должен использоваться .scanf. Все, кроме первого scanf, потребляют новую строку с предыдущего ввода в качестве первого символа.

Первый scanf потребляет восемь цифр плюс три строки новой строки между четырьмя цифрами, что составляет 11 символов.

Вторая потребляет новую строку после четвертого числа, считанного в первом scanf, плюс две цифры, составляет 3 символа.

Третий: новая строка, три цифры, символ новой строки, две цифры: 7 символов.

Четвертый: символ новой строки, четыре цифры: 5 символов.(то символ новой строки + 2 цифры для b)

Кстати, ваша цитата

Количество символов в строке формата, уже обработанными хранится в определенном месте.

неверен, это не число символов в строке формата, но количество символов, считанных из входного потока:

Соответствующий аргумент должен быть указателем на знаковое целое число, в котором должно быть записано количество символов, считанных с входным потоком до сих пор этим вызовом функции fscanf.

+0

Если первый 'scanf()' не использует новые строки, используемые для отправки ввода, то как бы вы объяснили счет ** 11 **? Ничто иное не описывает это, поскольку общее количество символов равно 8 (Цифры всех чисел для первого scanf() объединены) – Thokchom

+0

Ничто иное не описывает подсчеты в других 'scanf()' s, если мы предполагаем, что новые строки не используются. – Thokchom

+0

На самом деле эта линия взята из Cplusplusreference. Но я знал, что это значит, хотя это было написано не так. Я знал, что это означает, что символы читаются из входного потока. – Thokchom

 Смежные вопросы

  • Нет связанных вопросов^_^