2017-02-20 95 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操作系統的控制檯腳本的好書也是非常有益的。