【问题标题】:add break statement in while loop with getchar使用 getchar 在 while 循环中添加 break 语句
【发布时间】:2017-02-20 02:05:18
【问题描述】:

我是初学者,我已经编写了代码:

#include<stdio.h>
char c;
char a[100]={0};
int i;

int main(void)
{   
  while(1)
  {
    i=0;
    while(1){
      if((c=getchar())!='\n'){
        a[i]=c;
        i++;
      } else {
        break;
      }
    }
    printf("%s\n",a); 
  }
  return 0;
}

现在我想添加一个中断语句,当我键入 q 时,程序将中断。所以我的新程序是:

#include<stdio.h>
char c;
char a[100]={0};
int i;

int main(void)
{   
  while(1)
  {
    i=0;
    while(1){
      if((c=getchar())!='\n'){
        a[i]=c;
        i++;
      } else {
        break;
      }
    }
    printf("%s\n",a);
    if(getchar()=='q')break;       /*i added this*/
  }
  return 0;
}

我知道因为getchar() 冲突代码不正确,我该怎么办,添加type q break 命令。非常感谢。

【问题讨论】:

  • 从学习如何避免在不需要时使用global variables开始
  • @SeekAddo 全局是什么意思?这些变量具有内部链接,因此它们对其他模块不可见...您介意告诉我在the C standard 的哪个位置可以找到有关全局变量 的更多信息吗?我想学习如何声明和使用它们...
  • @Seb 全局变量可以从应用程序的任何地方访问。有些人可能认为它们是不好的做法,因为变量可以被另一个函数修改。 char c; char a[100]={0};int i; 都在main 之外定义。此应用程序中的任何功能都可以访问它们,这是一种不好的做法
  • @SeekAddo 可以从应用程序内的anywhere 访问这些全局变量吗?在他们的声明之前怎么样,例如char return_c(void) { return c; } 紧随其后的是 char c;... 这可能吗?可以从其他翻译单元访问这些全局变量吗?你了解什么是翻译单元吗?
  • 你自己说过,globals anywhere 都可以访问...但是你可以从我的代码中看到,c 无法访问anywhere 尽管是在函数之外声明的,因为它不能被声明为 before 的函数访问!所以这些变量都不是全局变量,C 也没有全局变量。另一个例子是翻译单元;一旦您了解了如何使用链接器,您会发现使用链接器链接的模块无法访问这些变量...进一步证明 C 没有 全局变量。 但最终的证明是在我之前链接到的 C 标准中...

标签: c while-loop break getchar


【解决方案1】:

我是初学者,我已经编写了代码

哦哦!这里开始......首先,对于任何试图通过无指导的反复试验来学习的人来说,成功学习可移植、符合标准的 C 编程语言的几率非常低。有一本非常好的书可供您用作指南,但您需要阅读它并在偶然发现它们时做练习。如果你有兴趣,那就是 K&R2E。


任何类似于char c; c = getchar(); 的内容都是错误的,因为从int(getchar 返回)到char 的缩小转换会丢弃错误处理信息。

getchar 返回的任何字符值都将作为unsigned char 值转换为int,因此从技术上讲它会更正确(尽管仍然不正确) 使用该类型。

错误值以负整数形式返回,例如EOF,不要与字符值混淆,这正是您的代码通过丢弃错误信息而出错的原因。

getchar 返回int,因此将值存储到int,然后测试错误,然后,如果必须,将其转换为一个unsigned char。


现在我想添加一个 break 语句,当我键入 q 时,程序将中断。

根据前面的讨论,这样的要求是多余的,但是很容易合并如果您正确处理错误。只需在错误处理中插入一个额外的测试来匹配q,然后就可以了!

尽管如此,错误处理很可能已经解决了这个问题,因为大多数操作系统都有一个机制关闭stdin,这会导致getchar 返回EOF,从而触发错误处理条款。例如,这通常通过在 Linux 中按 CTRL+d 或在 Windows 中按 CTRL+z 来实现。


总之,如果您还没有读过一本,那么一本关于 C 的好书似乎并不能让您受益;一本关于为您最喜欢的类 Unix 操作系统编写控制台脚本的好书也会非常有益。

【讨论】:

    【解决方案2】:

    不太可能是你真正想要的,但至少这是可行的

    #include<stdio.h>
    
    int main(void)
    {
      char a[100]={0};
      int i = 0;
      do {
        int c = getchar();
        switch (c) {
           case EOF:
               /*EOF*/
               return -1;
           case '\n':
               a[i] = 0;
               printf("%s\n",a);
               i= 0;
               break;
           default:
               a[i++] =c;
               break;
      } while (c != 'q' || i > 1);
      return 0;
    }
    

    【讨论】:

    • 您确定EOF 保证为-1?为什么要注入幻数,而不仅仅是写EOF?
    • 我用 -1 来说明 c 不能是 char 类型,但我当然可以写一个更长的解释——是的,虽然 EOF 通常是 -1,然后是 @987654321 @
    • 另外,与你的介绍相反(“不太可能是你真正想要的”),我认为这 是 可能是 OP 要求的......所以你我已经为此 +1 以及您的准正确 getchar 错误处理。
    【解决方案3】:

    试试这个代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define q 113  --> These values are coming from ASCII table.
    #define Q 81 
    
    int main(void)
    {
        char ch = 0;
        do
        {
            ch = getchar();
            switch(ch)
            {
                case q:
                    // your logic goes here
                    exit(0);
                case Q:
                    // your logic goes here
                    exit(0);
                /* more cases can come here */
            }
        }
        while(1);
    }
    

    【讨论】:

    • 感谢 Soren,已修复。此外,如果有一些 exit_flag 或需要开关外的条件,我们仍然可以使用 break 而不是 exit()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2021-07-18
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多