Как остановить чтение ввода при достижении определенного символа - PullRequest
0 голосов
/ 31 октября 2019

Давайте предположим, что кто-то пишет какой-то текст. Моя программа должна отсканировать этот текст, а затем распечатать все символы друг под другом. Тем не менее, он должен только читать ввод, пока не появится *. Таким образом, когда ввод "Hello * дорогой", он должен читать только "Hello". Я использовал * в качестве аргумента в цикле while, но моя программа сканирует «Hello *» вместо «Hello». Как мне избавиться от *?

#include <stdio.h>

int main()
{
    char c1;
    while (c1!='*'){
        scanf("%c", &c1);
        printf("c1: %c \n", c1);
     }
    return 0;
}

Ответы [ 5 ]

4 голосов
/ 31 октября 2019

Вы должны посмотреть на getchar()

#include <stdio.h>

int main()
{
    int c1;
    while ((c1=getchar())!=EOF && c1!='*'){
       printf("c1: %c \n", c1);
    }
    return 0;
}

РЕДАКТИРОВАТЬ: и таким образом, нет неопределенного поведения, потому что c1 всегда инициализируется (см. Ответ @Blaze):)

3 голосов
/ 31 октября 2019

Вы можете переключить операторы scanf и printf и поставить начальный scanf перед циклом:

int main()
{
    char c1 = '\0';
    do {
        printf("c1: %c \n", c1);
        if (scanf(" %c", &c1) != 1)
            return -1;
    } while (c1 != '*');
    return 0;
}

Также обратите внимание, что, поскольку ваша программа в настоящее время существует, проблема не только впечать *, но это неопределенное поведение, потому что c1 не инициализируется при первом запуске c1 != '*'.

1 голос
/ 31 октября 2019

Используя scanf() и , выполняя полную проверку ошибок и ведение журнала:

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main(void)
{
  int result = EXIT_SUCCESS; /* Be optimistic. */

  {
    int r;

    {
      char c1 = 0;
      while (EOF != (r = fscanf(stdin, " %c", &c1)) && c1 != '*')
      {
        if (1 != r)
        {
          fputs("Invalid input. Retrying ...", stderr);
        }
        else
        {
          printf("c1: %c \n", c1);
        }
      }
    }

    {
      int errno_save = errno;

      if ((EOF == r) && ferror(stdin))
      {
        errno = errno_save;
        perror("scanf() failed");
        result = EXIT_FAILURE;
      }
    }
  }

  return result;
}
0 голосов
/ 31 октября 2019
    #include<stdio.h>
    #include<ctype.h>
    int main()
    {
        char string;
        do
        {
            printf("String is :%c\n",string);
            if(scanf("%c",&string)!=1)
            {
                return 0;
            }
        }while(string!='*');
        return 0
}

Здесь:


Сначала он получит символ строки и сравнит его с символом *, если символ не найден, он напечатает символ. иначе он найдет, что вернет 0, и программа будет удалена.


0 голосов
/ 31 октября 2019

Используйте время или, когда вы хотите проверить условие в начале цикла, делайте ... до тех пор, пока вы не хотите проверить в конце. Если вы хотите проверить в середине, я предпочитаю бесконечный цикл ("while (TRUE)" или "for (;;)") и использование if / break в середине. Если взять ваш цикл, это будет:

while (TRUE){
    scanf("%c", &c1);
    if (c1=='*') {
        break;
    }
    printf("c1: %c \n", c1);
}

Некоторым людям это не нравится, альтернатива - сделать это функцией, используя return вместо break:

boolean get_and_print_if_not_end() {
    scanf("%c", &c1);
    if (c1=='*') {
        return true;
    }
    printf("c1: %c \n", c1);
    return false;
}

Youя бы назвал это в базовом цикле while:

while (!get_and_print_if_not_end()) {
    // Nothing to do here.
}
...