scanf не работает должным образом

Я попытался выполнить следующий простой код в ubuntu 15.10. Но код ведет себя нечетно, чем ожидалось

#include int main(){ int n,i=0; char val; char a[20]; printf("\nEnter the value : "); scanf("%s",a); printf("\nEnter the value to be searched : "); scanf("%c",&val); int count=0; for(i=0;i<20;i++){ if(a[i]==val){ printf("\n%c found at location %d",val,i); count++; } } printf("\nTotal occurance of %c is %d",val,count); return 0; } output: -------------------------- Enter the value : 12345678 Enter the value to be searched : Total occurance of is 0 

Второй scanf для получения значения для поиска, похоже, не работает. Остальная часть кода выполняется после первого scanf без второго входа.

После первого scanf () в каждом scanf () в части форматирования помещаем пробел

Так что измените это

 scanf("%c",&val); 

в этот

 scanf(" %c",&val); 

Причина в том, что scanf () возвращается, когда видит новую строку, а при первом запуске scanf () вы вводите ввод и нажмите enter. scanf () потребляет ваш вход, но не остается новой строкой, поэтому после scanf () потребляет оставшуюся новую строку.

Помещение пробела в части форматирования делает оставшуюся новую линию потребленной.

Вы можете использовать fgets() :

 #include int main() { int n, i = 0; char val; char a[20]; printf("\nEnter the value : "); fgets(a, 20, stdin); printf("\nEnter the value to be searched : "); scanf("%c", &val); int count = 0; for (i = 0; i < 20; i++) { if (a[i] == val) { printf("\n%c found at location %d", val, i); count++; } } printf("\nTotal occurance of %c is %d", val, count); return 0; } 

или очистить stdin :

 #include void clearstdin(void) { int c; while ((c = fgetc(stdin)) != EOF && c != '\n'); } int main() { int n, i = 0; char val; char a[20]; printf("\nEnter the value : "); scanf("%s",a); clearstdin(); printf("\nEnter the value to be searched : "); scanf("%c", &val); int count = 0; for (i = 0; i < 20; i++) { if (a[i] == val) { printf("\n%c found at location %d", val, i); count++; } } printf("\nTotal occurance of %c is %d", val, count); return 0; } 

Кроме того, см. C: Несколько scanf, когда я вводим значение для одного scanf, он пропускает второй scanf

 printf("\nEnter the value : "); scanf("%s",a); printf("\nEnter the value to be searched : "); scanf("%d",&val); // here is different 

я не знаю почему, но код выше работает …

 scanf("%d",&val); 

Вы можете использовать «% c» вместо «% c» для строки формата. Пустой приводит к тому, что scanf () пропускает пробел (включая символы новой строки) перед чтением символа.