Nano Hash - криптовалюты, майнинг, программирование

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

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

#include<stdio.h>
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 для получения искомого значения, похоже, не работает. Остальная часть кода выполняется после первого сканирования без ввода во второй раз.

25.12.2015

  • ia[i] моя опечатка как a[i] 25.12.2015
  • Почему бы не проверить возвращаемое значение из scanf? Также сделайте так, чтобы он не переполнял массив 25.12.2015
  • Если вы на SO воете от боли по этому поводу, scanf() работает точно так, как ожидалось. 25.12.2015
  • %c принять '\n', 12345678(Ввод) -> 12345678'\n' 25.12.2015

Ответы:


1

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

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

scanf("%c",&val);

в это

scanf(" %c",&val);

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

Вставка пробела в часть форматирования приводит к тому, что оставшаяся новая строка используется.

25.12.2015

2

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

#include<stdio.h>
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<stdio.h>

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;
}

Кроме того, см. second-s">C: Несколько сканов, когда я ввожу значение для одного скана, он пропускает второй сканф

25.12.2015

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

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

scanf("%d",&val);
25.12.2015
  • scanf удаляет пробелы, за исключением случаев, когда используется формат символов (%c). В примере OP ввод 12345678 и нажатие клавиши ввода означает, что a получает 12345678, а в буфере стандартного ввода есть символ новой строки ('\n'). %d удаляет его, а %c нет 25.12.2015

  • 4

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

    25.12.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..