到达某个字符后如何停止读取输入

时间:2019-10-31 15:00:27

标签: c printf scanf

让我们假设有人在写一些文字。我的程序必须扫描该文本,然后在彼此之间打印所有字符。但是,它仅应读取输入,直到*出现。因此,当输入为“ Hello * darling”时,应仅读取“ Hello”。我在while循环中使用*作为参数,但是我的程序扫描的是“ Hello *”而不是“ Hello”。我如何摆脱*?

#include <stdio.h>

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

5 个答案:

答案 0 :(得分:4)

您应该查看getchar()

#include <stdio.h>

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

编辑:这样,就不会有未定义的行为,因为c1总是被初始化的(请参阅@Blaze答案):)

答案 1 :(得分:3)

您可以切换scanfprintf语句,并在循环前放置一个初始scanf

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

还请注意,与您的程序当前一样,打印*不仅存在问题,而且是未定义的行为,因为c1c1 != '*'的第一次运行中未初始化。 / p>

答案 2 :(得分:1)

使用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;
}

答案 3 :(得分:0)

在要在循环开始时检查条件的时候或在要检查条件时使用,请执行...直到您想在结束时检查。如果要在中间进行检查,我更喜欢无限循环(“ 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;
}

您可以在一个基本的while循环中调用它:

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

答案 4 :(得分:0)

    #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,并且程序将被清除。