2016-11-08 43 views
1

我已經編寫了從小寫字母變爲大寫字母的程序。問題是,我不知道如何讓它讀取整個文本而不是一行。按下Enter後程序返回輸出,我希望在CTRL + Z之後這樣做。讀取整個輸入而不是單行

#include <stdlib.h> 
#include <stdio.h> 


void makeUpper(char *s) { 
    int i; 
    for(i = 0; s[i] != '\0'; i++){ 
     s[i] = toupper(s[i]); 
    } 
    printf("%s", s); 
} 


int main() { 
    char string[1000]; 

    fgets(string, 1000, stdin); 

    makeUpper(string); 
    return 0; 
} 
+0

你是什麼意思「閱讀全文,而不是一條線」? – Rafal

+0

不同的選項在這裏:http://stackoverflow.com/a/1836454/694576 – alk

+0

@Rafal我的意思是不要停止接受數據按下輸入後,在控制檯CTRL + Z之後 – NouName

回答

2

fgets()一旦遇到換行符就會停止。所以,你不能解決它讀取多行。所以,你必須看看替代品。

的方法之一是爲使用getchar()是一個循環,只要有在緩衝區房間或EOF收到:

int main(void) { 

    char string[1000]; 
    size_t i = 0; 

    do { 
     int ch = getchar(); 
     if (ch == EOF) break; 
     string[i] = ch; 
     i++; 
    } while (i < sizeof string - 1); 
    string[i] = 0; 

    makeUpper(string); 
    return 0; 
} 

記住,CTRL + Z適用於Windows(送EOF)閱讀。在* nix系統上,您必須使用Ctrl + D發送EOF。

+0

「*'fgets()'會在遇到換行符時停止。*」值得一提的是,這是Windows特有的。在IX'ish系統上,'Ctrl-D'表示'EOF'很好地結束了'fgets()'。 – alk

+0

我並不是指'D' <->'Z'的差異,但是事實上,如果已經給出了一些輸入,Windows上的Ctrl-Z將不會結束fgets(),而在UNIX上在這種情況下爲'Ctrl-D')。 – alk

+0

通過任何操作系統特定的方式發送EOF將結束fgets()。但是AFAICT,OP的問題是*不是檢測EOF,而是讀取多行(基本上OP由於'fgets()'停在換行符而被阻止,而他想要讀取更多內容直到EOF由他明確發送)。 – usr

3

只是把你fgets(string, 1000, stdin)成,而loop.here是解決

#include <stdlib.h> 
#include <stdio.h> 

void makeUpper(char *s) { 
    int i; 
    for(i = 0; s[i] != '\0'; i++){ 
     s[i] = toupper(s[i]); 
    } 
    printf("%s", s); 
} 


int main() { 
    char string[1000]; 

    while(fgets(string, 1000, stdin)!=NULL)//for getting input untill pressing CTRL+Z. 
    { 
     makeUpper(string); 
    } 


    return 0; 
} 
+0

你在Windows上測試過這個嗎? – alk

+0

@alk是的!首先我嘗試在我的窗口中工作正常,然後發佈在這裏:)。 – Real73

+0

使用哪種編譯器? – alk

相關問題