Еще одна проблема с scanf массивов символов в c? - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть этот код, который работает:

 int main()
    {
        char a[100];
        int i;
        int n=3;
        for(i=1;i<=n;i++){
            printf("insert char \n");
            scanf("%c",&a[i]);
            getchar();
        }
        for(i=1;i<=n;i++){
            printf("%c ",a[i]);
        }
    }

Я вставляю AB c Он печатает AB c, пока все хорошо, я хотел бы иметь возможность вставить размер N с scanf, но если я поставлю scanf из n следующим образом:

int main()
        {
            char a[100];
            int i;
            int n;
            scanf("%d",&n);
            for(i=1;i<=n;i++){
                printf("insert char \n");
                scanf("%c",&a[i]);
                getchar();
            }
            for(i=1;i<=n;i++){
                printf("%c ",a[i]);
            }
        }

, когда я запускаю программу, это вызывает проблемы во втором для l oop, я ввожу ab c, а второй for возвращает пустые символы, фактически выполняет новую строку n раз, в C, когда каждая программа завершает «PROCESS RETURNED et c». печатается. Когда я запускаю первый код, символы печатаются в одной и той же строке, а в следующей строке появляется «ПРОЦЕСС ВЕРНУТЬСЯ», вместо второго кода после вставки печатаются n пустых строк, а затем «ПРОЦЕСС ВЕРНУТЬСЯ», даже если я не написано \ n в printf. Я пытался проверить, хранится ли n в том же месте, что и некоторый элемент a (с printf ("% p", & a [i]) или printf ("% p", & a) и printf ("% p ", & n)), но адрес другой. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

Вы должны использовать getchar() после чтения n, потому что символ новой строки '\ n' останется во входном буфере, и ваш второй scanf в for l oop будет читать это.

Также вы должны начать с индекса 0. Вы можете попробовать следующий код.

int main()
 {
   char a[100];
   int i;
   int n;
   scanf("%d",&n);
   getchar();
  for(i=0;i<n;i++){
    printf("insert char \n");
    scanf("%c",&a[I]);
    getchar();
  }
  for(i=0;i<n;i++){
   printf("%c ",a[I]);
  }
 }
2 голосов
/ 05 апреля 2020

если первая программа, так как вы scan начинаете с символа, в буфере ничего нет, тогда вы вызываете getchar, который будет принимать \n в качестве ввода, но во второй программе после ввода int n у вас будет один \n в буфер (scanf принимает только одно целое число и оставляет \n в буфере), поэтому, когда вы вызываете scanf для вашего персонажа, он принимает \n в качестве ввода.

, поэтому я предлагаю добавить одно пробел в scanf:

 for(i=1;i<=n;i++){
                printf("insert char \n");
                scanf(" %c",&a[i]);//add space here
            }
...