C 当达到某个字符时,如何停止读取输入

C 当达到某个字符时,如何停止读取输入,c,printf,scanf,C,Printf,Scanf,让我们假设有人在写一些文字。我的程序必须扫描文本,然后打印彼此下面的所有字符。但是,它应该只在*出现之前读取输入。因此,当输入为“Hello*darling”时,它应该只显示“Hello”。我在while循环中使用*作为参数,但我的程序扫描“Hello*”而不是“Hello”。我怎样才能摆脱*呢 #include <stdio.h> int main() { char c1; while (c1!='*'){ scanf("%c", &c1)

让我们假设有人在写一些文字。我的程序必须扫描文本,然后打印彼此下面的所有字符。但是,它应该只在*出现之前读取输入。因此,当输入为“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;
}
#包括
int main()
{
字符c1;
而(c1!=“*”){
scanf(“%c”和“c1”);
printf(“c1:%c\n”,c1);
}
返回0;
}

您可以切换
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!='*'时未初始化

您应该查看

#包括
int main()
{
int c1;
而((c1=getchar())!=EOF&&c1!='*')){
printf(“c1:%c\n”,c1);
}
返回0;
}
编辑:这样,就没有未定义的行为,因为
c1
总是初始化的(请参见@Blaze answer:)

使用
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;
}
#包括
#包括
#包括
内部主(空)
{
int result=EXIT_SUCCESS;/*保持乐观*/
{
INTR;
{
字符c1=0;
而(EOF!=(r=fscanf(标准输入、%c、&c1))&&c1!=“*”)
{
如果(1!=r)
{
fputs(“无效输入。重试…”,stderr);
}
其他的
{
printf(“c1:%c\n”,c1);
}
}
}
{
int errno_save=errno;
如果((EOF==r)和铁氧体(stdin))
{
errno=errno\u保存;
perror(“scanf()失败”);
结果=退出故障;
}
}
}
返回结果;
}

使用while或for当您要检查循环开始时的条件时,请执行。。。直到你想在最后检查。如果你想在中间检查,我喜欢一个无限循环(“虽然(真)”或“为(;))),并使用中频。进行循环,这将是:

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.
}
#包括
#包括
int main()
{
字符串;
做
{
printf(“字符串为:%c\n”,字符串);
如果(scanf(“%c”,&string)!=1)
{
返回0;
}
}while(string!='*');
返回0
}
在这里:


首先,它将获取字符串并将其与*字符进行比较。如果未找到该字符,它将打印该字符。否则它将返回0,程序将被删除



OT:这里您使用的是
c1
未初始化:
while(c1!='*'){
。检查c1是否为“”。然后继续打印。循环再次启动后,它会检查字符是否匹配。直到此时才检测到“”面包车。
char c1;
应该是
int c1;
while((c1=getchar())!='*')
应该是
while((c1=getchar())!=EOF&&c1!='*'))
。仍然有一个输入错误:
'EOF'
应该是
EOF
:)非常感谢!所以基本上我忽略了EOF参数。你能解释一下为什么这么重要吗?我不太明白为什么这会消除*,据我所知,EOF是“文件的结尾”,所以它应该是输入的结尾,对吗?是“while”吗告诉程序:“一直扫描到*并且*是文件的结尾”?否,这意味着:“虽然输入尚未结束(
(c1=getchar())!=EOF
),并且输入与“*”(
c1!=“*”
)不同,但请执行…”。第一部分只是一个安全防护,通过尝试读取已结束的输入来避免未定义的行为。它应该检查
scanf
返回值(在两个位置)。@IanAbbott这是一个很好的建议。我将它添加到了答案中。由于未知原因,涉及未被爱的表亲
do{…}while(…)
会更优雅。@alk你是对的。我总是忘记这个循环的存在。:)在任何情况下,每次用户点击回车键,循环都会执行,并通过点击回车键读取新行。使用
scanf(“%c,”
。在这里也适用。是的,它应该是。scanf()这本身就是一个很大的话题,我只想在这里讨论循环条件。
while (!get_and_print_if_not_end()) {
    // Nothing to do here.
}
    #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
}