Мой код продолжает печатать » (двойные кавычки) из ниоткуда

#c

Вопрос:

Я даже не просил печатать двойные кавычки. Но он продолжает печататься после того, как я ввел ввод, начинающийся с D. Когда я ставлю «C», вывод нормальный. Пример:

вход > D

2

9

egdqncekq

B4 я поставил «egdqncekq», программа почему-то печатает двойные кавычки.

 #include <stdio.h>
int main() {
  char cd, m;
  int size, i, disp, m1;
 
  cd=getchar();
  scanf("%d", amp;disp);
  scanf("%d", amp;size);
 
  switch(cd)
  {
  case 'C':
  for(i=0; i<=size; i  )
  {
    m=getchar();
    m1=m disp;
    if(m1>122)
    {
      m1=m1-26;
    }
    printf("%c", m1);
  }
  break;

  case 'D':
    for(i=0; i<=size; i  )
    {
      m=getchar();
      m1=m-disp;
      if(m1<97)
      {
        m1=m1 26;
      }
      printf("%c", m1);
    } 
    break;
  }
  printf("n");
  return 0;
}
 

Комментарии:

1. Как вы «видите» двойные кавычки? Это не отображается в ваших выходных данных. По крайней мере, неясно, как вы приходите к выводу, что он их печатает.

2.@kaylum ссылка ссылка всегда после того, как я спрашиваю значение размера.

Ответ №1:

После второй scanf во входном буфере остается символ новой строки (ASCII 10). Эта новая строка подхватывается getchar функцией в каждом из циклов.

В случае «C» к этому значению добавляется 2, что приводит к 12. Это символ ввода формы ASCII, который печатается в виде дополнительной новой строки.

В случае «D» из этого значения вычитается 2, в результате чего получается 8. Это значение меньше 97, поэтому добавляется 26, в результате чего получается 34, что является кодом ASCII для " символа, который затем печатается.

Перед вводом switch инструкции вы должны выполнить вызов getchar в цикле, пока не увидите новую строку. Это приведет к удалению входного буфера.

Комментарии:

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