Как я могу получить строку от пользователя без пробелов, используя scanf? - PullRequest
0 голосов
/ 03 ноября 2018

Это код C для получения строки для типов скобок '()' & '<>' & '{}' & '[]' от пользователя. Длина этой строки равна n, и это ввод пользователя.

int main()
{
  long int n;
  int i;
  scanf("%lld", &n);
  char array[n];
  for(i=0; i<n ; i++)
  {
     scanf("%s", &array[i]);
  }
 }

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

Например, если я наберу {((), программа не запустится. но если я наберу { ( ( ), программа покажет правильный результат. Как я могу решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Если вы хотите убедиться, что пользователь вводит как минимум 1 пробел между каждым «действительным» символом, вы можете просто подождать в цикле, пока пользователь не добавит пробел.


    char c;
    for (i = 0; i &lt n; i++)
    {
        c = '\0';
        while (c != ' ')        // wait for the user to type a space character
        {
            scanf ("%s", &c);
        }
        while (c == ' ')        // wait for the user to type something else
        {
            scanf ("%s", &c);
        }
        array[i] = c;
    }

0 голосов
/ 03 ноября 2018

Изменение:

scanf("%s", &array[i]);

к этому:

scanf(" %c", &array[i]);

, поскольку вы пытаетесь прочитать строку за символом.

Обратите внимание на пробел перед %c, который будет использовать завершающий символ новой строки, который будет оставлен в буфере стандартного ввода после того, как вы ввели n.

Я написал об осторожности при чтении символа с scanf() здесь .

Теперь, даже если вы используете {(() или { ( ( ) для ввода, оно будет таким же, так как scanf() будет игнорировать пробелы.

Однако, вы должны null завершить вашу строку, если вы хотите, чтобы она использовалась стандартными функциями, которые вы почти наверняка захотите. Например, если вы должны использовать printf("%s", array);, то вы должны иметь array null прекращено.

Подход к этому, предполагая, что пользователь будет вводить правильно (в идеальном мире), вы могли бы сделать это:

#include <stdio.h>
int main()
{
  long int n;
  int i;
  scanf("%ld", &n);

  // create an extra cell to store the null terminating character
  char array[n + 1];

  // read the 'n' characters of the user
  for(i=0; i<n ; i++)
  {
     scanf(" %c", &array[i]);
  }

  // null terminate the string
  array[n] = '\0';

  // now all standard functions can be used by your string
  printf("%s\n", array);

  return 0;
 }

PS: scanf("%lld", &n); -> scanf("%ld", &n);. Используйте предупреждения вашего компилятора! Он расскажет вам об этом ..

...