2017-02-20 51 views
0

我是首发,我已经写了代码:在while循环添加break语句在使用getchar

#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; 
} 

,现在我有我想添加一个break语句的想法,当我键入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()冲突的代码是不正确的,我该怎么办,要添加键入q break命令。非常感谢。

+0

从学习如何避免在不需要时使用'全局变量'开始 –

+0

@SeekAddo你是什么意思*全局*?这些变量具有内部联系,所以它们对其他模块不可见...您介意告诉我在[C标准](http://www.iso-9899.info/n1570.html)中我可以找到的位置有关*全局变量*的更多信息?我想了解如何声明和使用它们... – Sebivor

+0

@Seb全局变量可以从应用程序中的任何位置访问。有些人可能认为他们是不好的做法,因为这些变量可以通过其他功能进行修改。 'char c; ''char a [100] = {0};''int i;'全部在'main'之外定义。这个应用程序中的任何函数都可以访问它们,这是一个不好的做法 –

回答

0

试试这个代码:

#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); 
} 
+0

谢谢Soren,固定。而不是'exit()',如果需要一些exit_flag或条件以外的条件,我们仍然可以使用'break'。 –

1

不太可能是你真正想要的东西,但至少这会工作

#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; 
} 
+0

你确定'EOF'保证为-1?为什么要注入幻数,而不是只写'EOF'? – Sebivor

+0

我用-1来说明'c'不能是char类型,但是我确定我可以写更长的解释 - 是的,而EOF通常是-1,然后[它只能保证是负数数字](http://stackoverflow.com/a/4706217/668501) – Soren

+0

这将更好地说明使用'unsigned char a [100] = {0};'... – Sebivor

1

我是首发,我已经写了代码

呃哦!这里有...首先,成功学习便携式,符合标准的C语言编程语言的几率是压倒性低的对于任何试图通过无引导反复试验来学习的人来说。有一个真的很不错本书可以作为指导,但你需要读它做你的练习,因为你偶然发现他们。如果你有兴趣,那就是K & R2E。因为从int变窄转换(其getchar返回)到char丢弃错误处理信息


任何类似char c; c = getchar();是错误的。

通过getchar返回任何字符值会随着unsigned char值转换为int,所以它会在技术上是更正确(虽然仍然不正确)使用该类型。

将错误值作为负整数返回,如EOF,不要与字符值混淆,这正是您的代码通过丢弃错误信息而错误的方式。

getchar回报int,因此该值存储到int,然后测试是否有错误,然后,如果你必须将其转换到一个unsigned char


,现在我有我想添加一个break语句,当我键入q,程序将打破主意。

从前面的讨论继,这样的要求是多余的,仍然容易纳入如果你正确处理错误。只需插入一个额外的测试,以匹配q进入错误处理,并presto!

然而,错误处理很可能已经解决了这个问题,因为大多数操作系统有一个机制来接近stdin,这将导致getchar回到EOF,由此而引发的错误处理条款。例如,通常通过在Linux中按CTRL + d或在Windows中按CTRL + z来实现。


总之,提供你是不是已经阅读一个,它似乎关于C一个很好的书是不是所有的希望对你有益;一本关于您最喜欢的类Unix操作系统的控制台脚本的好书也是非常有益的。