1

Учусь, учусь и тут наткнулся на обычное задание, где я хочу чтобы по завершению тела main() у меня спросили "Хотите еще раз? 1 - да | 2 - нет." Но выходит ужасно криво и неработопригодно. Потратил слишком много времени для такого задания... Можете просто исправить код и сказать почему в моем при повторном проходе срабатывает сразу оба scanf() при приеме значения к клавиатуры? И как сделать чтобы верхнее стиралось? Огромная благодарнасть откликнувшимся!

#include <stdio.h>
#include <ctype.h>


int main(){

  char a[10];
  int i=0,d, sum;
  do{
    puts("Enter your character and see what functions do: \n");
    sum += d;
    scanf("%c",&a[i]);
    i++;
    printf("The letter %c %s letter\n",a[i],isalpha(a[i])!=0?"is a":"is not a");
    printf("The letter %c %s space or tab character\n\n\n",a[i],isblank(a[i])!=0?"is a":"is not a");

    puts("One more?\n");
    puts("1 - NO || OTHER - YES\n");
    scanf("%d",&d);
  }
  while(d!=1);
  return 0;
 }
rtn2020
  • 87
  • У вас там неопределённое поведение. sum и d не инициализированы. – Кирилл Малышев Jan 21 '20 at 02:01
  • только что прировнял к нулям оба, но все также. У меня повторяется луп, но в начале по коду у меня должен приниматься символ, потом выводить что с ним стало после обратки с функциями ctype.h потом сканироваться должно число, где 1 - выход, 2 повтор. Но у меня код принимает символ, выходит вывод что с ним стало, А ПОТОМ уже непонятно почему скан с числом становиться и условием повторением и сразу же идет на скан с символом, при повторе выходит только 1 скан, и это скан с условием ввода числа. Символ молчит... – rtn2020 Jan 21 '20 at 02:07
  • Покажите пример входных данных и выходных. У вас там i++ рано делается и символ будет считываться пробельный, если вы после числа его поставите. – Кирилл Малышев Jan 21 '20 at 02:16
  • я ответил на свой же вопрос картинкой, посмотрите пожалуйста. – rtn2020 Jan 21 '20 at 02:24

2 Answers2

1

Это у Вас конец строки \n считывается как следующий символ.

char a[10], b;
int i=0, d, sum;
do {
  ...
  scanf("%d%c", &d, &b);
}
...
  • Спасибо большое за помощь. Я пока буду копаться в коде, вы и так много времени потратили на меня). Надеюсь заработает! – rtn2020 Jan 21 '20 at 02:42
  • Здравствуйте еще раз! И спасибо что помогаете новичкам таким как я. Я разобрался в проблеме. Вот: – rtn2020 Jan 21 '20 at 03:08
  • The %c conversion specifier won't automatically skip any leading whitespace, so if there's a stray newline in the input stream (from a previous entry, for example) the scanf call will consume it immediately.

    One way around the problem is to put a blank space before the conversion specifier in the format string: scanf(" %c", &c); The blank in the format string tells scanf to skip leading whitespace, and the first non-whitespace character will be read with the %c conversion specifier.

    – rtn2020 Jan 21 '20 at 03:09
  • В ОБЩЕМ, НУЖНО СПЕЙС ПЕРЕД ПРОЦЕНТАМИ ПОСТАВИТЬ В scanf(" %c", &a); – rtn2020 Jan 21 '20 at 03:10
  • @rtn2020 Молодец. Успехов. –  Jan 21 '20 at 03:14
  • Спасибо большое! – rtn2020 Jan 21 '20 at 03:27
0

Вот такой выход у меня получается. Вначале символ, затем ответ на вопрос. После ответа на вопрос, условие выполняется, что да, хочу еще раз. Но он также идет почему то и на скан от символа

РЕШЕНО! ПРОБЛЕМА ЗАКЛЮЧАЛАСЬ В ОШИБКЕ: The %c conversion specifier won't automatically skip any leading whitespace, so if there's a stray newline in the input stream (from a previous entry, for example) the scanf call will consume it immediately.

One way around the problem is to put a blank space before the conversion specifier in the format string: scanf(" %c", &c); The blank in the format string tells scanf to skip leading whitespace, and the first non-whitespace character will be read with the %c conversion specifier.

ЕСЛИ КРАТКО, ПЕРЕД ПРОЦЕНТАМИ В scanf нужно стаить пробел. ВОТ: scanf(" %c",&a);

rtn2020
  • 87