2016-01-04 5 views
-1

Когда я использую функцию printf(), а затем scanf() один я попал в неприятности. Я пишу ниже кода, и компилятор eclipse говорит, что ошибок нет и нет, но когда я его компилирую, он показывает: insert array dimension insert array elements. Это не заставляет меня вставлять что-либо, и программа заканчивается. Я также попытался добавить fflush(stdout), но ничего не меняется. Что мне делать?printf scanf function and fflush()

int main(void) { 
    int *V; 
    int i; 
    int N; 
    printf("insert array dimension"); 
    fflush(stdout); 
    scanf("%n", &N); 
    V=(int*)malloc(sizeof(int)*N); 
    if(V==NULL){ 
     printf("\n error"); 
     fflush(stdout); 
     return 0; 
    } 
    printf("\ninsert array elements"); 
    fflush(stdout); 

    return EXIT_SUCCESS; 
} 
+1

Почему вы используете спецификатор '% n' для' int'? – haccks

+1

Не бросайте результат 'malloc' & friends в C. И всегда' free' выделяет память. – Olaf

+0

'scanf' считается злым, потому что он выполняет две задачи и оставляет входной поток в неизвестном состоянии при ошибке. Используйте 'fgets()' и 'sscanf()', если вы хотите убедиться, что знаете, сколько введенных данных было прочитано. – msw

ответ

1

Преобразование этой линии Scanf ("% N", & N); с scanf ("% d", & N); работает отлично.

0

Вы должны изменить '% п' с '% г'

int main(void) { 

int *V; 
int i; 
int N; 
printf("insert array dimension"); 
fflush(stdout); 
scanf("%d", &N); 
V=(int*)malloc(sizeof(int)*N); 
if(V==NULL){ 
    printf("\n error"); 
    fflush(stdout); 
    return 0; 
} 
printf("\ninsert array elements"); 
fflush(stdout); 

return EXIT_SUCCESS; 
} 
2

TL; DR - Изменение scanf("%n", &N); на scanf("%d", &N);


Цитирую C11 стандарт, глава §7.21.6.2 , fscanf(), для спецификатора формата (акция шахта)

n

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

Таким образом, в основном,

scanf("%n", &N); 

не хранит значение в ввода в N, а это попытаться сохранить «количество символов для чтения из входного потока до сих пор», который, вероятно, будет 0, в вашем случае.

Так, позже в случае malloc(), если передать 0 размер, он может либо вернуть NULL или указатель, который может быть передан только free(). С помощью этого указателя позже вызывается undefined behavior.

Возможно, вы смогли отладить проблему, если бы вы проверили значение returnvalue scanf() на первом месте.

Необходимо иметь правильный спецификатор формата для int, %d.