【问题标题】:Terminate While Loop scanf("%c",&ch)终止 While 循环 scanf("%c",&ch)
【发布时间】:2016-02-10 22:59:56
【问题描述】:

我想一次读入一个字符。我不知道这个输入会有多大,所以我没有将数组指向输入,而是一次处理每个字符并构造一个链表。我遇到的问题是,在读取最后一个字符后如何终止这个 while 循环?

struct node{
struct node *next;
int data;
};

int main(){

int i; //iterator
char ch;
//char *numberArr = (char*)malloc(1024,sizeof(char*));
struct node* head = NULL;
struct node* curr = NULL;
struct node* tail = NULL;


printf("Please input a number: ");
while (((scanf(" %c",&ch)) != -1)){
    printf("%c",ch);
}

【问题讨论】:

  • while (((scanf(" %c",&ch)) == 1) - 你有什么问题?无论如何,与-1 比较是错误的!阅读函数的手册页。
  • 你在“最后一个”字符之后输入什么?您是否等待,按 或某些键导致文件结束?
  • 好吧,我想做的是 scanf(" %c",&c) 并且输入将是一个非常大的数字输入,所以 3143143124132543125,一旦最后 5 被读入我'想取消while循环。因为一旦字符被读入,它就会在while循环中挂起。
  • @user3260745 程序如何知道这是最后 5 个?如果你在那之后继续输入 638961 怎么办?

标签: c while-loop scanf


【解决方案1】:

如果要读取所有字符,包括空格字符,请使用:

int c;
while ( (c = getchar()) != EOF )
{
   // Use c as a char.
}

如果您想跳过空白字符,请使用:

char c;
while ( scanf(" %c", &c) == 1 )
{
   // Use c.
}

注意intchar 在这两种情况下用作c 的类型。

【讨论】:

  • 所以我所有的角色都被阅读了。唯一的事情是,我希望 while 循环在所有内容都被读取后终止,while 循环终止并且程序关闭。我的输入应该以 '\n' 字符结尾,但即使 (((scanf(" %c",&ch)) != '\n')) 也不会在新行上终止。
  • @user3260745,没错。您必须通过将 EOF 发送到流来终止它。在 unix 终端上,通常是 Ctrl+D 和 windows cmd 窗口,通常是 Ctrl+Z。
  • 好吧,我真的想通了!我猜当 scanf 从输入完成读取时,它会返回一个整数
  • @user3260745,你应该可以使用!= EOFscanf 应返回成功分配的接收参数数量,如果在分配第一个接收参数之前发生读取失败,则返回 EOF。
【解决方案2】:

好吧,我真的想通了!我猜当 scanf 从输入完成读取时,它会返回一个整数

参考: 本·格拉瑟在这篇文章中的回答: scanf() in while loop not terminating?

【讨论】:

    【解决方案3】:

    scanf 函数成功完成后,它将是一个非零值(值>0)。如果发生任何问题,它将返回 0。我认为在任何情况下你都不会得到 -1。所以如果你想终止循环,你可以提示用户提供一个特殊字符,可以表示结束输入。或者如果您从文件中读取它,那么您可以使用 EOF 来终止循环。

    希望你会喜欢这个解决方案....

    如果有人在我的回答中发现任何错误,请在下面发表评论。 我会非常感谢他。

    【讨论】:

      猜你喜欢
      • 2022-07-18
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      • 2015-12-02
      • 1970-01-01
      • 2014-11-26
      相关资源
      最近更新 更多